我正在尝试创建一个程序来获取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?任何人都可以帮我理解这个吗?
为任何初学者的错误道歉,一般都是编码的新手,并且刚刚开始创建这个程序。
答案 0 :(得分:1)
Python为您提供了可以复制并再次粘贴到Python解释器中的字节字符串的表示。
为了使和能够将其粘贴到不处理原始字节的内容中,可以使用Python字节转义码\xHH
对任何不可打印的内容进行转义,表示一个字节的十六进制值。
可打印的任何内容都直接表示为ASCII字符。十六进制字节0x41是ASCII中的字母A
(大写),并按原样打印:
>>> 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图像,包括extracting EXIF information。