[英]Writing hex value into file Python
我真正在做的是使用python從JPEG創建BMP文件,並且其中包含一些標頭數據,其中包含諸如圖像的大小,高度或寬度之類的信息,因此基本上我想讀取JPEG文件,獲取其寬度和高度,然后進行計算BMP文件的新大小並將其存儲在標題中。
假設BMP文件的新大小為40000個字節,其十六進制值為0x9c40
,由於頭中有4個字節的空間來保存它,我們可以將其寫為0x00009c40
。 在BMP標頭數據中,首先寫入LSB,然后寫入MSB,因此我必須在文件中寫入0x409c0000
。
我的問題:
我能夠用C語言做到這一點,但我完全不知道如何使用Python做到這一點。
例如,如果我有i=40000
,並且通過使用str=hex(i)[2:]
我得到了十六進制值,現在通過某種編碼,我能夠添加額外的零,然后反轉代碼。 現在如何將此'409c0000'
數據寫入十六進制文件中?
BMP文件的標頭大小為54字節,因此還有另一種方法可以將數據存儲在字符串中,例如str='00ffcf4f...'
( str='00ffcf4f...'
54個字節),然后一次將整個str轉換為十六進制並寫入要歸檔嗎?
我的朋友告訴我使用unhexlify
的binascii
,通過執行unhexlify('fffcff')
得到'\\xff\\xfc\\xff'
,這是我想要的,但是當我嘗試unhexlify('3000')
得到'0 \\ x00' `這不是我想要的。 包含3、4、5、6或7的任何值都相同。這是正確的方法嗎?
您不是在寫十六進制,而是在寫二進制數據。 在處理二進制數據時,十六進制是一種有用的表示法 ,但不要將其與值混淆。
使用struct
模塊將整數數據打包為二進制結構,就像C一樣。
binascii.unhexlify
也是一個不錯的選擇,前提是您已經使用十六進制表示法將數據存儲在字符串中。 輸出是正確的 ,但是二進制表示形式僅對可打印ASCII范圍之外的字節使用十六進制轉義。
因此fffcff
確實正確地變成\\xff\\xfc\\xff
,以十六進制轉義表示3字節,而3000
是\\x30\\x00
,但是\\x30
是ASCII中的'0'
字符,因此該字節的Python表示形式僅使用了ASCII字符,因為這是解釋字節的最常用方法。
使用struct.pack()
將整數值40000 struct.pack()
為無符號整數(小端),然后變為:
>>> import struct
>>> struct.pack('<I', 40000)
'@\x9c\x00\x00'
其中40
個字節由該字節的ASCII字符@
字形表示。
如果這令人困惑,則始終可以通過另一種方式創建新的十六進制表示形式,並使用0 binascii.hexlify()
函數]( https://docs.python.org/2/library/binascii.html#binascii.hexlify )為您自己創建一個十六進制表示形式,僅用於調試輸出:
>>> import binascii
>>> binascii.hexlify(struct.pack('<I', 40000))
'409c0000'
並且您會看到@
字節仍然是正確的十六進制值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.