Правильный переход от шестнадцатеричной строки к байтовому массиву - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть шестнадцатеричная строка, составленная из следующих байтов:

['0x17', '0x9', '0x5', '0x1f', '0x0', '0x4', '0x16 ',' 0x0 ',' 0x28 ',' 0x53 ',' 0x1c ',' 0x8 ',' 0x12 ',' 0x11 ',' 0x40 ',' 0xe ',' 0x54 ',' 0x3b ',' 0x6 ', «0x1e», «0x45», «0x49», «0xa», «0x45», «0xe», «0x1c», «0x1f», «0x59», «0x41», «0x6», «0x4f», «0x59 ',' 0xb ',' 0x16 ',' 0x2 ',' 0x44 ',' 0x53 ',' 0x1 ']

Шестнадцатеричная строка выглядит следующим образом:

'17951f0416028531c8121140e543b61e4549a45e1c1f594164f59b16244531'

Как я могу получить исходный байтовый массив?

В python 3.x:

bytes.fromhex('17951f0416028531c8121140e543b61e4549a45e1c1f594164f59b16244531')

возвращает

b '\x17 \ x95 \ x1f \ x04 \ x16 \ x02 \ x851 \ xc8 \ x12 \ x11 @ \ xe5C \ xb6 \ x1eEI \ xa4 ^ \ x1c \ x1fYAd \ xf5 \ x9b \ x16 $ E1 ',

и в python 2.x: str('17951f0416028531c8121140e543b61e4549a45e1c1f594164f59b16244531').decode('hex') возвращает

b '\ x17 \ x95 \ x1f \ x04 \ x16 \ x02 \ x851 \ xc8 \ x12 \ x11 @ \ xe5C \ xb6 \x1eEI \ xa4 ^ \ x1c \ x1fYAd \ xf5 \ x9b \ x16 $ E1 '.

Оба из них совершенно неверны.И bytes.fromhex, и decode ('hex') читают по 2 байта за раз, поэтому '0x9' и '0x5' читаются как '0x95'.Есть ли способ исправить это?

Обратите внимание, я не могу контролировать генерацию исходной шестнадцатеричной строки.Приветствия.

1 Ответ

0 голосов
/ 24 февраля 2019

В вашей строковой кодировке несколько пар байтов были объединены;Убедившись, что каждый байт представлен двумя символами в вашей строке, вы получите то, что вы хотите:

In [6]: s
Out[6]: '1709051f0004160028531c081211400e543b061e45490a450e1c1f5941064f590b1602445301'

In [7]: bytes.fromhex(s)
Out[7]: b'\x17\t\x05\x1f\x00\x04\x16\x00(S\x1c\x08\x12\x11@\x0eT;\x06\x1eEI\nE\x0e\x1c\x1fYA\x06OY\x0b\x16\x02DS\x01'

Не зная, какую информацию представляет строка, априори нет способа определить, гденедостающие 0 должны быть добавлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...