Байт операций в Python - PullRequest
2 голосов
/ 22 марта 2020

Я работаю над проектом, в котором мне нужно выполнить некоторые байтовые операции, используя python, и я хотел бы понять некоторые основные c принципы, прежде чем я go продолжу с ним.

t1 = b"\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59"
t2 = "\xAC\x42\x4C\x45\x54\x43\x48\x49\x4E\x47\x4C\x45\x59"
print("Adding b character before: ",t1)
print("Using bytes(str): ",bytes(t2,"utf-8"))
print("Using str.encode: ",t2.encode())

В частности, я не могу понять, почему консоль печатает это, когда я запускаю приведенный выше код:

C:\Users\Marco\PycharmProjects\codeTest\venv\Scripts\python.exe C:/Users/Marco/PycharmProjects/codeTest/msgPack/temp.py
Adding b character before:  b'\xacBLETCHINGLEY'
Using bytes(str):  b'\xc2\xacBLETCHINGLEY'
Using str.encode:  b'\xc2\xacBLETCHINGLEY'

Я хотел бы понять, почему, если я использую bytes () или декодирую, я получить дополнительные "\ xc2" перед значением. Что это значит? Это должно появиться? И если так, как я могу избавиться от этого, не используя первый метод?

Ответы [ 2 ]

1 голос
/ 22 марта 2020

В строковом литерале \xhh (h - это шестнадцатеричное число git) выбирает соответствующий символ Unicode от U+0000 до U+00FF, где U + 00A C - ¬ «не знак». При кодировании в utf-8 все кодовые точки выше 0x7F занимают два или более байтов. \xc2\xac - это кодировка utf-8 U+00AC.

>>> "\u00AC" == "\xAC"
True
>>> "\u00AC" == "¬"
True
>>> "\xAC" == "¬"
True
>>> "\u00AC".encode('utf-8')
b'\xc2\xac'
>>> "¬".encode("utf-8")
b'\xc2\xac'
1 голос
/ 22 марта 2020

Потому что bytes объекты и str объекты - это разные вещи. Первый представляет последовательность байтов , последний представляет последовательность кодовых точек Unicode. Существует огромная разница между байтом 172 и кодовой точкой 172 Unicode.

В частности, байт 172 ничего не кодирует, в частности, в Unicode. С другой стороны, кодовая точка 172 Unicode относится к следующему символу:

>>> c = chr(172)
>>> print(c)
¬

И, конечно, они являются фактическими необработанными байтами, которым это будет соответствовать, зависит от кодировки. Используя utf-8, это двухбайтовая кодировка:

>>> c.encode()
b'\xc2\xac'

В кодировке latin-1 это 1 байт:

>>> c.encode('latin')
b'\xac'

Если вам нужны необработанные байты, самый точный / простой способ - использовать байтовый литерал.

...