[英]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 個字節。
當您有兩個字節A
和B
時,您可以將它們物理放置為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.