3

我正在尝试创建一个程序来获取 jpeg 的特定 EXIF 信息,而不使用 PIL 等。我正在读取二进制文件,但输出有点混乱......

file = open("/Users/Niko/Desktop/IMG.JPG", "rb")
print(file.read(16))

哪个输出:

b'\xff\xd8\xff\xe1/\xfeExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x0b\x01\x0f\x00\x02\x00\x00\x00\x06\x00\x00'

我感到困惑的是“\”、“/”和“*”是什么意思......我知道表示它的 jpeg 的前几个字节是 0xFF 0xD8,所以我认为 \s 是 0 ? 谁能帮我理解这一点?

对于初学者的任何错误,一般来说是编码新手,并且刚刚开始创建这个程序,我们深表歉意。

4

1 回答 1

1

Python 为您提供了字节字符串的表示形式,您可以将其复制并再次粘贴到 Python 解释器中。

为了使其可读在粘贴到不处理原始字节的内容时保留下来,任何不可打印的内容都使用 Python 字节转义码 进行转义\xHH,表示一个字节的十六进制值。

任何打印的内容都直接表示为 ASCII 字符。十六进制字节 0x41 是AASCII 中的字母(大写),打印如下:

>>> b'\x41'
b'A'

因此,*是 hex 2A,/是 hex 2F:

>>> hex(ord(b'*'))
'0x2a'
>>> hex(ord(b'/'))
'0x2f'

您可以binascii.hexlify()用来生成字节的全十六进制表示:

>>> from binascii import hexlify
>>> hexlify(b'\xff\xd8\xff\xe1/\xfeExif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x0b\x01\x0f\x00\x02\x00\x00\x00\x06\x00\x00')
b'ffd8ffe12ffe4578696600004d4d002a00000008000b010f0002000000060000'

也就是说,您最好安装Pillow(Python 图像库的现代化分支)并让它为您处理 JPEG 图像,包括提取 EXIF 信息

于 2013-11-06T16:31:38.883 回答