我真正在做的是使用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...'(最多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是'0'ASCII中的字符,因此该字节的Python表示仅使用该ASCII字符,因为这是解释字节的最常用方式.
使用struct.pack()无符号整数(little endian)打包整数值40000 然后变为:
>>> import struct
>>> struct.pack('<I', 40000)
'@\x9c\x00\x00'
Run Code Online (Sandbox Code Playgroud)
其中40字节由该字节的ASCII字符表示,@字形.
如果这令人困惑,您可以通过另一种方式创建一个新的十六进制表示并使用0 binascii.hexlify()函数](https://docs.python.org/2/library/binascii.html#binascii.hexlify)来创建一个十六进制为自己表示,只是为了调试输出:
>>> import binascii
>>> binascii.hexlify(struct.pack('<I', 40000))
'409c0000'
Run Code Online (Sandbox Code Playgroud)
你会发现该@字节仍然是正确的十六进制值.