[英]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.