【问题标题】:Writing hex value into file Python将十六进制值写入文件 Python
【发布时间】:2015-08-22 01:44:33
【问题描述】:

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

假设 BMP 文件的新大小为 40000 字节,其十六进制值为 0x9c40,现在由于标题中有 4 字节空间来保存它,我们可以将其写为 0x00009c40。在 BMP 头数据中,先写入 LSB,然后写入 MSB,所以我必须在文件中写入 0x409c0000

我的问题:-

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

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

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

  3. 我的朋友告诉我从binascii 使用unhexlify, 通过执行unhexlify('fffcff'),我得到'\xff\xfc\xff',这是我想要的,但是当我尝试unhexlify('3000') 时,我得到'0\x00'`,这不是我想要的。任何包含 3、4、5、6 或 7 的值都是相同的。这样做是否正确?

【问题讨论】:

  • 您可能想研究使用Pillow 在 Python 中操作和转换位图。或者您可以使用ImageMagick 套件中的convert 程序。

标签: python c string


【解决方案1】:

你不是在写十六进制,你是在写二进制数据。处理二进制数据时,十六进制是一种有用的表示法,但不要将表示法与值混淆。

使用 struct module 将整数数据打包成二进制结构,就像 C 语言一样。

binascii.unhexlify 也是一个不错的选择,前提是您已经拥有使用十六进制表示法的字符串中的数据。输出是正确的,但二进制表示只对可打印的 ASCII 范围之外的字节使用十六进制转义。

因此fffcff 确实正确地变为\xff\xfc\xff,以十六进制转义表示法表示3个字节,3000\x30\x00,但\x30 是ASCII 中的'0' 字符,因此Python 表示为byte 只是使用那个 ASCII 字符,因为这是解释字节的最常见方式。

使用struct.pack() 将整数值 40000 打包为无符号整数(小端序),然后变为:

>>> import struct
>>> struct.pack('<I', 40000)
'@\x9c\x00\x00'

40 字节由该字节的 ASCII 字符表示,@ 字形。

如果这令人困惑,您总是可以通过另一种方式创建一个新的十六进制表示并使用 0binascii.hexlify() 函数](https://docs.python.org/2/library/binascii.html#binascii.hexlify) 为自己创建一个十六进制表示,只是为了调试输出:

>>> import binascii
>>> binascii.hexlify(struct.pack('<I', 40000))
'409c0000'

您会看到@ 字节仍然是正确的十六进制值。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2014-03-16
    • 2013-01-07
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多