[英]Confused about bytes in Python
我最近從事了使用Python解析二進制數據的活動,但對Python處理“字節”項的方式感到困惑。 例如進行以下口譯對話:
>>> f = open('somefile.gz', 'rb')
>>> f
<open file 'textfile.gz', mode 'rb' at 0xb77f4d88>
>>> bytes = f.read()
>>> bytes[0]
'\x1f'
>>> len(bytes[0])
1
>>> int(bytes[0]) <---- calling __str__ automatically on bytes[0] ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '\x1f'
上面的會話顯示bytes [0]的大小為1個字節,但是__str__
表示形式是十六進制的。 不用擔心,但是當我嘗試將bytes [0]視為單個字節時,我會得到時髦的行為。
如果我想基於某個規范來解析/解釋二進制流,其中該規范包括十六進制,二進制和十進制表示,那么我將如何去做。
例如:“前兩個字節是\\xbeef
,下一個是十進制8
其后是一個壓縮位字段,其中該字節的8位中的每位代表一個標志?我猜那里有一些模塊可以完成此任務容易,但我想從頭開始。
我已經看到了對struct
模塊的引用,但是沒有引入新模塊就沒有辦法檢查直接讀取的字節嗎? 像bytes[0] == 0xbeef
?
有人可以幫我了解一般人如何使用Python解析符合規范的二進制數據嗎? 謝謝。
您正在使用Python2.x。 在Python 3.0之前,讀取文件(甚至是二進制文件)會返回字符串。 您所說的“字節”對象實際上是一個字符串。 像使用“ bytes [0]”那樣對字符串進行索引只會返回一個1個字符的字符串。
struct模塊可能最適合您想要的內容,但是如果您確實想要:
“像字節[0] == 0xbeef一樣?”
這將不起作用,因為0xbeef是兩個字節的序列,但是bytes [0]僅是一個字節。 您可以改為:
bytes[0:2] == b'\xbe\xef'
在Python 3.x中,事情的運行有點像您期望的那樣。 讀取二進制文件將返回一個bytes
對象,該對象的行為類似於1字節無符號整數的序列,而不是字符串。
如果要解析二進制數據,請簽出struct模塊。 這是文檔中的示例:
>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8
了解有關unpack
更多信息:)
因此,如果您想將前2個字節讀取為無符號的short,然后使用0xbeef進行測試:
struct.unpack('H', bytes[0:2]) == 0xbeef
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.