Abstract
通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入。
Introduction
使用環境:Windows XP SP3 + Visual C++ 6.0 SP6
將在wf.bin的0x33 byte處寫入0xAC值。
WriteByte.c / C
17行
將wf.bin開啟,rb表示read binary,+表示除了read外,也可以做write。
23行
由於要寫入的是1個byte,其值為0xAC,故先宣告buff這個char array,將0xAC填入。
25行
使用fseek將binary file的檔案位置移到0x33處,其中SEEK_SET表示offset是從檔頭開始。
26行
正式使用fwrite將buff寫入檔案。
Conclusion
以上的code看起來都很直觀,但讓我搞一天的地方是在17行,我原本以為既然是要寫入binary file,所以很直覺的這樣寫:
wb表示write binary,看起來非常直覺,但結果卻會變成位置0x33處的確會寫入0xAC, 但檔案卻到此為止,後面的資料完全不見了!!
為什麼會這樣呢?
在C IN A NUTSHELL語法暨程式庫標準辭典[1] p.208第7行:
也就是說,因為使用wb開啟,且又使用fseek()移動了binary file的位置到0x33,所以0x33之後檔案長度被截為0,然後fwrite()將0xAC寫到檔案位置0x33處。
所以雖然只是小小的差異,但結果卻天差了十萬八千里啊。
在此筆記fopen()所有參數排列組合的意義[2]
r 打開現有text file以便讀取 w 生成新text file或截短現有text file至零長度以便寫入 a 附加。生成新text file或打開現有text file以便在文件結束處寫入 rb 打開現有binary file以便讀取 wb 生成新binary file或將現有binary file截至零長度以便寫入 ab 附加。生成新binary file或打開現有binary file以便在文件結束處寫入 r+ 打開現有text file,以便更新(讀和寫) w+ 生成新text file或將現有text file截至零長度以便更新。 a+ 附加。生成新text file或打開現有text file以便更新,在文件結束處寫入 r+b或rb+ 打開現有binary file以便更新(讀和寫) w+b或wb+ 生成新binary file或截短現有文件至零長度以便更新 a+b或ab+ 附加。生成新binary file或截短現有文件至零長度以便更新,在文件結束處寫入
See Also
Reference
[1] Peter Prinz & Tony Crawford 2005, 蔡學鏞 編譯,C IN A NUTSHELL語法暨程式庫標準辭典,美商歐萊禮股份有限公司
[2] P.J Plauger, The Standard C Library
Original: https://www.cnblogs.com/oomusou/archive/2011/10/31/writebyte.html
Author: 真 OO无双
Title: (筆記) 如何寫入binary file某個byte的值? (C/C++) (C)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535034/
转载文章受原作者版权保护。转载请注明原作者出处!