我真正在做的是使用python从JPEG创建BMP文件,并且它有一些包含图像大小,高度或宽度等信息的标题数据,所以基本上我想读取一个JPEG文件,获取宽度和高度,计算BMP文件的新大小并将其存储在标题中。
让我们说BMP文件的新大小为40000字节,其十六进制值为0x9c40
,现在因为有4个字节的空间将其保存在标题中,我们可以将其写为{{ 1}}。在BMP头数据中,首先写入LSB,然后写入MSB,因此我必须在文件中写入0x00009c40
。
我的问题: -
我能用C做到这一点,但我完全不知道如何在Python中这样做。
例如,如果我有0x409c0000
,并且使用i=40000
我得到了十六进制值,现在通过一些编码,我能够添加额外的零,然后反转代码。现在如何将文件中的str=hex(i)[2:]
数据写为十六进制?
BMP文件的标头大小为54字节,所以还有另一种方法可以将数据存储在像'409c0000'
这样的字符串中(最多54个字节),并且只需将整个str转换为十六进制并将其写入文件?
我的朋友告诉我使用str='00ffcf4f...'
中的unhexlify
,
通过binascii
我得到unhexlify('fffcff')
这就是我想要的,但是当我尝试'\xff\xfc\xff'
时,我得到了' 0 \ x00'`这不是我想要的。对于包含3,4,5,6或7的任何值都是一样的。这是正确的方法吗?
答案 0 :(得分:6)
您正在编写十六进制,您正在编写二进制数据。处理二进制数据时,十六进制是一个有用的符号,但不要将符号与值混淆。
使用struct
module将整数数据打包成二进制结构,就像C一样。
binascii.unhexlify
也是一个不错的选择,前提是您已经使用十六进制表示法在字符串中包含数据。输出是正确的,但二进制表示仅对可打印ASCII范围之外的字节使用十六进制转义。
因此fffcff
正确变为\xff\xfc\xff
,以十六进制转义符号表示3个字节,3000
为\x30\x00
,但\x30
为{{1} ASCII中的字符,因此该字节的Python表示只使用该ASCII字符,因为这是解释字节的最常用方法。
使用'0'
作为无符号整数(小端)填充整数值40000然后变为:
struct.pack()
其中>>> import struct
>>> struct.pack('<I', 40000)
'@\x9c\x00\x00'
字节由该字节的ASCII字符表示,40
字形。
如果这很令人困惑,你总是可以通过另一种方式创建一个新的十六进制表示并使用0 @
函数](https://docs.python.org/2/library/binascii.html#binascii.hexlify)为自己创建一个十六进制表示,只是为了调试输出:
binascii.hexlify()
您将看到>>> import binascii
>>> binascii.hexlify(struct.pack('<I', 40000))
'409c0000'
字节仍然是正确的十六进制值。