程式設計修改BIN等二進位制檔案

2021-08-24 22:05:25 字數 2028 閱讀 4255

在此之前,我曾經寫過,把鈴聲,等資源轉化為陣列資料,也曾經寫過把陣列資料轉為和聲音.在某篇文章中,也曾經寫了從bin檔案中提取等資訊.這些都是利用程式設計的手段訪問解析二進位制檔案.都是對二進位制檔案進行操作.

我們獲得的手機或者其他嵌入式裝置的軟體,常常都是一些擴充套件名為bin的檔案,這些檔案就是二進位制檔案.對這類二進位制檔案的寫操作需要慎之又慎,一著出錯,就可能導致bin檔案再也無法使用.

我曾經寫了乙個修改軟體版本號的工具,主要用來修改mtk軟體的版本號.一般來說,為了軟體管理和維護方便,我們每次修改發布新軟體,都應該相應的公升級軟體版本號,有時軟體版本號忘記了公升級,往往需要重新new乙個軟體,費時又費力.還有就是有一些客戶,軟體相同,也使用相同的sp,只是客戶userid不同,這時也可以使用版本管理工具根據原始軟體修改替換id生成新的客戶軟體.所以研究bin,修改bin,提高工作效率,對於現階段減輕軟體工程師負擔還是一些意義的.

閒話就不說了,主要演算法就是:

1.把bin檔案讀入記憶體陣列中主要使用cfile類的read方法

2.查詢需要替換的字串,主要使用memcmp

3.替換新的字串,主要使用memcpy

4.把替換後的陣列寫入檔案,主要使用cfile類的write方法

cfile的方法直接呼叫,不再贅述.

查詢替換字串的函式如下,由於二進位制資料操作,無法使用strlen獲取長度,所以必須提供長度,由於bin檔案有對齊處理,如果使用不同長度字串替換時如果不考慮對齊會導致bin檔案失效,所以限制old和new串必須長度一樣,當然如果要使用長度不等的字串互相替換也是可以的,一是考慮位的對齊,二是考慮替換後不超出14m:

int strreplace(char *basestr, int basestrlen, char *oldstr, int oldstrlen, char *newstr, int newstrlen)

if(basestrlen < oldstrlen)

while(basestrlen-- > 0)

else }

return count>0?0:1;

}為該程式建立乙個對話方塊,包括三個edit控制項,第乙個edit顯示檔案名字,第二個顯示要替換的字串,第三個顯示新的字串,分別繫結三個cstring變數,m_filename , m_oldstr, m_newstr,三個按鈕,分別對事件開啟onok(), 替換onok2(),和退出按鈕:

按鈕事件分別為:

//開啟檔案

void cmodifybindlg::onok()

//cdialog::onok();

}//替換字串並生成新檔案

void cmodifybindlg::onok2()

if (strreplace((char *)buffer, filelen, (char *)(lpctstr)olds, olds.getlength(),

(char *)(lpctstr)news, news.getlength()) != 0)

cfile file2;

file2.open(getpath(m_filename)+"new_"+getfilename(m_filename),

cfile::modewrite|cfile::modecreate|cfile::typebinary);

file2.seek(0,cfile::begin);

file2.write(buffer,filelen);

file2.close();

afxmessagebox("替換完成");

free(buffer);

}在替換生成新bin時,呼叫了兩個解析路徑獲得檔名和目錄的函式:

//從路徑中分離檔名:

cstring getfilename(cstring pathname)

} return pathname.mid( i+1 );

} //從路徑中分離路徑名(去除檔名):

cstring getpath(cstring pathname)

i++;

} return pathname.left( j+1 );

}

python處理二進位制檔案( bin

最近遇到了python處理.bin檔案的一些問題,簡單地羅列一下。擴充套件名為.bin的檔案就是乙個二進位制檔案 binary 不同於文字檔案,二進位制檔案用記事本 notepad 等開啟都是亂碼。像是這樣 但是.bin檔案可以用winhex等軟體開啟。二進位制檔案裡面儲存的都是資料,只有按照某個預...

讀寫檔案,讀二進位制檔案,bin檔案

讀普通檔案 filereader reader new filereader mefilename bufferedreader br new bufferedreader reader stringbuilder lines new stringbuilder while line br.read...

GNU彙編生成二進位制bin檔案

眾所周知,早期的gnu彙編只能支援32 的編寫,不支援16為的 所以用gnu彙編寫boot檔案是很困難的事情。後來gnu經過改進,終於支援16位的 編寫了,但是gnu彙編寫的 編譯出的純二進位制檔案還是預設為32位的。例如一下 section text globl start start movl ...