Есть ли способ получить прямое шестнадцатеричное значение в байтах вместо получения строкового значения? - PullRequest
1 голос
/ 27 марта 2019

В python3.5 мне нужно преобразовать строку в значение поля, поддерживаемое IPFIX для пакета UDP.Пока я отправляю строковые байты как пакет UDP, я не могу восстановить строковые данные снова.В Wireshark говорится, что «искаженные данные».

Я обнаружил, что IPFIX поддерживает только «ASCII» для строк.Итак, я преобразовал значение ASCII в шестнадцатеричное, а затем преобразовал в байты.Но при конвертации гекса (" 4B ") в байт.Я не получаю шестнадцатеричное значение в байтах, а не получаю строку в байтах (" K ").

Я попробовал следующее в консоли python.Мне нужен точный байт, что я ввел.Но похоже, что b '\ x4B' вместо '\ x4B' я получаю 'K'.Я использую python3.5

b '\ x4B'

b'K '

Код: "K" .encode ("ascii")

Фактический OP: b'K '

Ожидаемый OP: b' \ x4B '

1 Ответ

1 голос
/ 27 марта 2019

Есть несколько способов сделать это:

1. Метод hex (python 3.5 и выше)

>>> 'K'.encode('ascii').hex()
'4b'  # type str

2. Использование binascii

>>> binascii.hexlify('K'.encode('ascii'))
b'4b'  # type bytes

3. Использование str.format

>>> ''.join('{:02x}'.format(x) for x in 'K'.encode('ascii'))
'4b'  # type str

4. Использование format

>>> ''.join(format(x, '02x') for x in 'K'.encode('ascii'))
'4b'  # type str

Примечание: Методы, использующие format, не очень эффективны.

Если вы действительно заботитесь о \x, вам придется использовать format, например:

>>> print(''.join('\\x{:02x}'.format(x) for x in 'K'.encode('ascii')))
\x4b
>>> print(''.join('\\x{:02x}'.format(x) for x in 'KK'.encode('ascii')))
\x4b\x4b

Если вы заботитесь о заглавных буквах, вы можете использовать X вместо x, например:

>>> ''.join('{:02X}'.format(x) for x in 'K'.encode('ascii'))
'4B'
>>> ''.join(format(x, '02X') for x in 'K'.encode('ascii'))
'4B'

Прописные буквы и \x:

>>> print(''.join('\\x{:02X}'.format(x) for x in 'Hello'.encode('ascii')))
\x48\x65\x6C\x6C\x6F

Если вы хотите bytes вместо str, просто закодируйте вывод в ascii снова:

>>> print(''.join('\\x{:02X}'.format(x) for x in 'Hello'.encode('ascii')).encode('ascii'))
b'\\x48\\x65\\x6C\\x6C\\x6F'
...