簡體   English   中英

Python - 字節數組 function 與字符串文字

[英]Python - bytearray function with string literal

在 Python 中學習 OpenCV,我遇到了 function bytearray(),它返回一個字節數組。 在互聯網上閱讀有關此 function 的信息,我看到了一個示例,其結果我無法完全理解。 該示例可以在這里找到: https://www.geeksforgeeks.org/python-bytearray-function/

編碼:

str = 'Geeksforgeeks'

array2 = bytearray(str, 'utf-16')

print(array2)

結果是:

bytearray(b'\xff\xfeG\x00e\x00e\x00k\x00s\x00f\x00o\x00r\x00g\x00e\x00e\x00k\x00s\x00')

雖然我知道 \x 是一個轉義序列,表示一個十六進制值,但 ff、fe、00 等后面的值在談論字符時對我來說沒有意義。

例如,字符串以引號開頭,后跟大寫字母 g,即 G。

字節數組 function 的結果是\xfeG

我很難將 map \xfeG 轉換為大寫字母 G。如果我們假設 \x 表示以下是十六進制數字,我會將其讀作 0xfe = 254。查看該數字的 ASCII 表,我得到了一些信息與 G. 完全不同,並且 0xfeG 不存在。

有人可以幫我解決這個問題,因為我有點迷路。

謝謝,

在談論字符時,ff、fe、00 等后面的值對我來說沒有意義。

那是因為你不知道UTF-16是如何工作的。

UTF-16 中的 16 是指字符使用的位數,即每個字符將使用 2 個字節。

當您有兩個字節AB時,您可以將它們物理放置為AB (稱為“小端”)或BA (即“大端”)。 這被稱為字節順序,重要的是要知道以后將字節成功轉換回字符(“解碼”)。

為此,字節字符串以字節順序標記(“BOM”)開頭。 \xff\xfe是“小端”類型的 BOM。

G這樣的字符不需要完整的 16 位,因此第二個字節保持為空( \x00 )並且G變為\x47\x00 Python 顯示小於 127 的所有字節的字符,因此顯示為G\x00 ,但它是同一回事。

小端編碼:

b'\xff\xfeG\x00e\x00e\x00k\x00s\x00f\x00o\x00r\x00g\x00e\x00e\x00k\x00s\x00'
 'LE BOM |G   |e   |e   |k   |s   |f   |o   |r   |g   |e   |e   |k   |s    '

大端編碼(注意不同的 BOM):

b'\xfe\xff\x00G\x00e\x00e\x00k\x00s\x00f\x00o\x00r\x00g\x00e\x00e\x00k\x00s'
 'BE BOM  |   G|   e|   e|   k|   s|   f|   o|   r|   g|   e|   e|   k|   s'

兩個字節字符串都使用.decode('UTF-16')正確解碼,因為 BOM 通知.decode()字符串的內部布局。

其他字符占據更多的 16 位。 例如,在 little-endian UTF-16 中變為\x57\x5b ,Python 顯示為W[有點無益。

b'\x57\x5b'.decode('UTF-16')   # -> '字'
b'W['.decode('UTF-16')         # -> '字'

當缺少 BOM 時,Python 將默認采用“little-endian”。 否則,您需要明確說明類型:

b'[W'.decode('UTF-16-BE')      # -> '字'

暫無
暫無

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

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