簡體   English   中英

對Python中的字節感到困惑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM