带字符串文字的Python-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

在学习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\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')      # -> '字'