簡體   English   中英

如何像Python 2.7中那樣從字節字符串中提取混合的二進制和ascii值?

[英]How can I extract mixed binary and ascii values from a bytes string as in Python 2.7?

以下是從文件中提取的二進制圖像(在字節之間插入空格以使讀取更容易)。 文件以“ rb”模式打開。

01 77 33 9F 41 42 43 44 00 11 11 11

在Python 2.7中,我將其讀取為字符串,並使用ord()提取二進制值,然后可以提取甚至搜索字符串中的特定文本值(例如字符4-7中的“ ABCD”) 。 二進制字節可以是0-FF之間的任何值。 由於這個原因,我一直在推遲到python 3的轉換。

我需要能夠在Python 3中將字節字符串視為二進制和ascii(而非unicode)值的混合。 格式不是固定的,它由數據結構組成。 例如,字節2中的33可能是一條記錄長度,它告訴我下一條記錄的開始位置。 換句話說,我不能只說我知道文本字符串始終位於位置4。

我不寫文件,只是使用它,因此更改它不是一種選擇。

我已經看到了許多使用b'和其他東西轉換固定字符串的示例,但是我需要一種方法來混合這些值,提取字節,2字節到8字節的值(從16位到64位的字),以及在較大的字符串中提取/搜索ASCII字符串。

對於我需要的東西,Python 3中的字節/字符分隔似乎有些不靈活。 我確定有辦法做到這一點,但我還沒有找到一個似乎可以解決此問題的示例或已回答的問題。

這是一個簡化的示例,我無法提供真實數據(它是專有數據),但這說明了問題。 實際文件可能很短(<1K)或很大(> 100K),其中包含多個不同大小的記錄。

是否有一種簡單直接的方法來本質上復制我在Python 2.7中具有的功能?

這是在Windows上。

謝謝

我需要能夠在Python 3中將字節字符串視為二進制和ascii(而非unicode)值的混合。 格式不是固定的,它由數據結構組成。 例如,字節2中的33可能是一條記錄長度,它告訴我下一條記錄的開始位置。 換句話說,我不能只說我知道文本字符串始終位於位置4。

  1. 按照您的操作,以二進制模式讀取文件。 這將產生一個bytes對象,該對象在3.X是一樣的一個str (因為這將是在2.X)。

  2. 根據需要將字節解釋為字節,以弄清楚數據的一般結構。 切片bytes會像以前一樣產生另一個bytes 索引產生int與單個字節( 如前)的數字值-沒有ord必需的。

  3. 確定了代表字符串的字節子集后(為方便起見,您將其切成薄片),請使用適當的編碼轉換為字符串:例如str(my_bytes, 'ascii') 請注意,ASCII將處理字節值0x80到0xFF。 特別是對於二進制格式的舊文件格式,您的數據很有可能實際上是類似於Latin-1的東西: str(my_bytes, 'iso-8859-1')

在字符串中搜索特定的文本值

您可以在文本級別或字節級別進行搜索- bytes對象支持in運算符,可以搜索bytes的子序列或單個整數值。 在字符串轉換之前還是之后進行搜索更有意義,這取決於您在做什么。

使用b'和其他東西來轉換固定字符串

b''只是文字 bytes對象的語法。 如果您要求repr從文件中讀取的內容,就會看到此內容。 在代碼中的現有字符串文字上加上b並不是真正的“轉換”任何東西,而是將其替換為您應該首先擁有的值。

2字節至8字節的值(16位至64位字)

該文檔至少說得盡我所能:

>>> help(int.from_bytes)
Help on built-in function from_bytes:

from_bytes(...) method of builtins.type instance
    int.from_bytes(bytes, byteorder, *, signed=False) -> int

    Return the integer represented by the given array of bytes.

    The bytes argument must be a bytes-like object (e.g. bytes or bytearray).

    The byteorder argument determines the byte order used to represent the
    integer.  If byteorder is 'big', the most significant byte is at the
    beginning of the byte array.  If byteorder is 'little', the most
    significant byte is at the end of the byte array.  To request the native
    byte order of the host system, use `sys.byteorder' as the byte order value.

    The signed keyword-only argument indicates whether two's complement is
    used to represent the integer.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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