Python декодирует неожиданное поведение в шестнадцатеричной строке

У меня есть шестнадцатеричная строка, которую я хочу преобразовать в массив numpy из целых чисел.

Я не хочу использовать циклы for, потому что цикл через массивы numpy не рекомендуется.

Итак, я делаю следующее:

vector = np.fromstring( s.decode('hex'), dtype=np.uint8 )

Если, например, s = 'a312', s.decode('hex') возвращает '\xa3\x12', что правильно.

Но если s = 'a320', s.decode('hex') возвращает '\xa3 ', что на первый взгляд кажется немного странным, потому что я ожидаю '\xa3\x20'.

Вы можете помочь мне ?


person SebMa    schedule 29.06.2017    source источник


Ответы (1)


Дело в том, что двоичная строка в Pyhon представляется как ее эквивалент ASCII.

Эквивалентом '\x20' является пробел, как видно из ASCII таблица:

Hex  Dec  ASCII
 20   32    (space)

Если вы напишете '\x20' в терминале, он напечатает пробел:

>>> '\x20'
' '
>>> 'a320'.decode('hex') == '\xa3\x20'
True

Обратите внимание, что это только аспект представления: за кулисами двоичная строка содержит двоичное значение 0010 0000.

person Willem Van Onsem    schedule 29.06.2017
comment
Хорошо, я вижу. Наверное, decode это не то, что мне нужно. Как я могу получить '\xa3\x20' из s = 'a320'? - person SebMa; 29.06.2017
comment
@SebMa: ты внимательно прочитал ответ? Вы получаете \xa3\x20. Все дело в том, как представлена ​​строка. - person Willem Van Onsem; 29.06.2017
comment
Ты прав, уже конец дня, я начинаю уставать. decode() в конце концов делает то, что я хочу, и я получаю ожидаемое целочисленное значение: np.fromstring( '\xa3 ', dtype=np.uint8 )[1] - person SebMa; 29.06.2017
comment
С python3 s.decode('hex') не работает: AttributeError: 'str' object has no attribute 'decode', как я могу заставить код работать как в python2, так и в python3? - person SebMa; 30.06.2017
comment
@SebMa: В Python-3.x действительно нет декодирования. Для этого вы можете использовать bytes. Кроме того, Python-2.x и Python-3.x на самом деле два разных языка. Сделать программу, которая работает на обоих, теоретически возможно, но очень сложно (поскольку, например, map, zip и т. д. ведут себя по-разному). - person Willem Van Onsem; 30.06.2017