将十六进制值写入文件Python

时间:2015-06-07 14:41:18

标签: python c string

我真正在做的是使用python从JPEG创建BMP文件,并且它有一些包含图像大小,高度或宽度等信息的标题数据,所以基本上我想读取一个JPEG文件,获取宽度和高度,计算BMP文件的新大小并将其存储在标题中。

让我们说BMP文件的新大小为40000字节,其十六进制值为0x9c40,现在因为有4个字节的空间将其保存在标题中,我们可以将其写为{{ 1}}。在BMP头数据中,首先写入LSB,然后写入MSB,因此我必须在文件中写入0x00009c40

我的问题: -

  1. 我能用C做到这一点,但我完全不知道如何在Python中这样做。

    例如,如果我有0x409c0000,并且使用i=40000我得到了十六进制值,现在通过一些编码,我能够添加额外的零,然后反转代码。现在如何将文件中的str=hex(i)[2:]数据写为十六进制?

  2. BMP文件的标头大小为54字节,所以还有另一种方法可以将数据存储在像'409c0000'这样的字符串中(最多54个字节),并且只需将整个str转换为十六进制并将其写入文件?

  3. 我的朋友告诉我使用str='00ffcf4f...'中的unhexlify, 通过binascii我得到unhexlify('fffcff')这就是我想要的,但是当我尝试'\xff\xfc\xff'时,我得到了' 0 \ x00'`这不是我想要的。对于包含3,4,5,6或7的任何值都是一样的。这是正确的方法吗?

1 个答案:

答案 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' 字节仍然是正确的十六进制值。