繁体   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