簡體   English   中英

將十六進制值寫入文件Python

[英]Writing hex value into file Python

我真正在做的是使用python從JPEG創建BMP文件,並且其中包含一些標頭數據,其中包含諸如圖像的大小,高度或寬度之類的信息,因此基本上我想讀取JPEG文件,獲取其寬度和高度,然后進行計算BMP文件的新大小並將其存儲在標題中。

假設BMP文件的新大小為40000個字節,其十六進制值為0x9c40 ,由於頭中有4個字節的空間來保存它,我們可以將其寫為0x00009c40 在BMP標頭數據中,首先寫入LSB,然后寫入MSB,因此我必須在文件中寫入0x409c0000

我的問題:

  1. 我能夠用C語言做到這一點,但我完全不知道如何使用Python做到這一點。

    例如,如果我有i=40000 ,並且通過使用str=hex(i)[2:]我得到了十六進制值,現在通過某種編碼,我能夠添加額外的零,然后反轉代碼。 現在如何將此'409c0000'數據寫入十六進制文件中?

  2. BMP文件的標頭大小為54字節,因此還有另一種方法可以將數據存儲在字符串中,例如str='00ffcf4f...'str='00ffcf4f...' 54個字節),然后一次將整個str轉換為十六進制並寫入要歸檔嗎?

  3. 我的朋友告訴我使用unhexlifybinascii ,通過執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM