带字符串文字的Python-bytearray函数
在学习Python中的OpenCV时,我遇到了返回字节数组的函数bytearray()。在互联网上读到这个函数时,我看到了一个例子,其结果我无法完全理解。可在此处找到样本: 守则:带字符串文字的Python-bytearray函数,python,Python,在学习Python中的OpenCV时,我遇到了返回字节数组的函数bytearray()。在互联网上读到这个函数时,我看到了一个例子,其结果我无法完全理解。可在此处找到样本: 守则: str = 'Geeksforgeeks' array2 = bytearray(str, 'utf-16') print(array2) 结果是: bytearray(b'\xff\xfeG\x00e\x00e\x00k\x00s\x00f\x00o\x00r\x00g\x00e\x00e\x00k\x00
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
bytearray函数的结果是\xfeG
我很难将\xfeG映射到大写字母G。
如果我们假设\x指示以下为十六进制数,我将其解读为0xfe=254。查看这个数字的ASCII表,我得到了与G完全不同的东西,并且0xfeG不存在
有人能帮我吗,因为我有点迷路了
谢谢,
在谈到字符时,ff、fe、00等后面的值对我来说没有意义
那是因为你不知道如何工作
UTF-16中的16表示字符使用的位数,即每个字符将使用2个字节
当您有两个字节A
和B
时,您可以将它们物理地放置为AB
(称为“小尾端”)或BA
(即“大尾端”)。这就是所谓的字节顺序,对于以后成功地将字节转换回字符(“解码”)来说,了解这一点很重要
为此,字节字符串以字节顺序标记(“BOM”)开头\xff\xfe
是“little endian”类型的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):
两个字节字符串都使用.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') # -> '字'
您希望了解UTF-16编码,例如,at.FEFF是UTF-16编码字节数组的字节顺序标记(BOM)。根据尾数,这两个字节可能会翻转。“g”。encode('utf16')`->
b'\xff\xfeG\x00'
-前两个字节是字节顺序标记(BOM)。
b'[W'.decode('UTF-16-BE') # -> '字'