提问人:Nene Tetteh Wayo Akwetteh 提问时间:10/8/2023 最后编辑:VolkNene Tetteh Wayo Akwetteh 更新时间:10/10/2023 访问量:54
在python中将string转换为Bytearray
conversion of string to Bytearray in python
问:
我有一个这种格式的字符串变量: var = “x14\x12\x13\x11\x69”
我的挑战是将这个字符串转换为字节数组,以精确地得到: 作者Tearray(b'\x14\x12\x13\x11\x69')
expected_bytearry = bytearray(var, 'utf-8')
if i print(expected_bytearry), I get this result
bytearray(b'\\x14\\x12\\x13\\x11\\x69'). Which contains double backslash.
Another approach which I tried was expected_bytearryy = bytearray.fromhex(var.encode().hex())
with that, **I get bytearray(b'\x14\x12\x13\x11i')** **instead of bytearray(b'\\x14\\x12\\x13\\x11\\x69')**
I also tried:
b = bytearray(ord(c) for c in var)
a = bytearray(var, 'utf-8')
Both of them produced the same result of double backslash.
将不胜感激。
谢谢
答:
这就是编码。所以你需要用这种编码。unicode_escape
decode
但不幸的是,你处于最糟糕的情况:解码是在字节字符串上完成的,而你有一个字符串。然后产生一根绳子,你想要一个 bytearray。
因此,这个相当复杂的解决方案
var.encode('ascii').decode('unicode_escape').encode('latin1')
在这种事情上,让人们的思想陷入循环的原因是,python在与人类编码人员交互时也会使用。这是在读取字符串或字节时(在代码中)。以及将字节打印到控制台时。unicode-escape
重要的是要理解,在字节中,没有反斜杠,没有.只有 2 个字节。20 和 19(十六进制 14 和 13)。
同样在字符串中。只是一个字符串,由当前编码中 20 和 19 的 2 个代码表示的任何内容组成(因为当前编码很可能是 unicode,因此它们只是 unicode 的“ascii”部分,在单个字节上。因此,ascii 代码 20 和 19 的不可打印字符)b'\x14\x13\
x
'\x14\x13'
但是在你的字符串中,你确实有文字反斜杠和 x。就像在字符串中一样,它是由python打印的(使用转义编码)。但是您只有 2 个反斜杠,而不是 4 个(只有在使用转义编码打印时,它们才显示加倍)。r'\x14\x13'
'\\x14\\x13'
因此,我在这里所做的是从字符串开始(此处以原始字符串形式显示),这是一个由 8 个文字字符反斜杠 x、1、4、反斜杠、x、1、3 组成的字符串。var=r'\x14\x13'
我用 ascii 对这些字符进行编码(实际上没关系:这些都是在任何编码中都具有单字节编码的字符。任何不到 40 年左右的机器都不会有默认编码,其中编码与 ascii 中的编码不同。这些只是数字、字母和反斜杠。但严格来说,那是 ascii)。所以我得到了一个 8 字节的字节(因为这 8 个字符中的每一个都有 1 字节的 ascii 编码)。
这恰好是 92、120、49、52、92、120、49、51。(在 Python 中打印为 .但同样,忽略这一点,这只是令人困惑,因为 python 恰好已经在其 REPL 中完成了我们正在做的部分工作。请记住,字符串是字符序列,字节序列是介于 0 和 255 之间的数字序列。与C语言相反,这根本不是一回事。字符不是数字)b'\\x14\\x13'
现在,我可以使用编码将这 8 个字节解码为字符。在 unicode 转义中,字节 92(ascii 表示反斜杠)120(ascii 表示 x)后跟 2、4 或 6 个十六进制数字(ascii),表示其 unicode 由这 2、4 或 6 位数字组成的字符。unicode-escape
所以,现在我们有一个只有 2 个字符的字节字符串。unicode 为 20 的那个和 unicode 为 19 的那个。
如果我们想要这些 unicode,那么,我们需要将它们编码回来。这里有一个潜在的问题案例:对于超过 128 的代码。它们以 utf-8 格式以两个字节编码。但是由于 unicode 的 256 个第一个代码与 latin1 中的代码相同,因此将它们编码回 latin1 将创建一个字节整值,即 unicode。例如,如果你的字符串是 ,那么会得到两个 char ,其 unicode 是 0xc3 和 0xa9(不要与 unicode 为 0xe9 的单个 char 混淆,即在 utf-8 中由 2 个字节 0xc3 0xa9 表示)。您不想用 utf-8 对它们进行编码,因为每个字节都是两个字节(0xc3 0x83、0xc2、0xa9)。而且你不能用 ascii 编码它们,因为它们使用 8 位。但是将它们编码为将给出 2 个字节,其值是 unicode 0xc3 和 0xa9。r'\xc3\xa9'
r'\xc3\xa9'.encode('ascii').decode('unicode-escape')
'é'
'é'
latin1
因此,r'\x14\x15'.encode('ascii').decode('unicode-escape').encode('latin1')
评论
0*1000+1*100+2*10*3*1
123
0123
评论