Преобразование строки в байты выводит на консоль странный шестнадцатеричный код - PullRequest
0 голосов
/ 30 сентября 2018

Введение в мою проблему:

Я пытаюсь написать программу на C ++, которая получает данные по UDP, используя WinSock2.Для этого у меня есть заранее написанный скрипт Python, который отправляет 10-байтовые пакеты на указанный порт, где их получает программа C ++.Я получил передачу данных для работы, однако я не совсем понимаю, какие данные отправляются.

Моя проблема: Я запускаю скрипт Python из cmd, который печатает отправленный текстна консоли.Я также добавил строку в скрипт, которая преобразует строку в байты, чтобы проверить, что именно отправляется.Первая строка, которую я добавил, довольно проста:

logger.debug("Sending packet len %s, data %s", sizeof(packet), bytes(packet))
logger.debug("Sending packet len %s, data %s", sizeof(packet), packet)

И это вывод в моем терминале (из 3 разных отправленных пакетов):

Image here

Что меня смущает, так это то, что я ожидал бы, что шестнадцатеричный код будет содержать только шестнадцатеричные символы, но вместо этого там также есть несколько, казалось бы, случайных символов / букв, хотя сам печатный текст выглядит просто отлично.Может кто-нибудь объяснить мне, откуда взялись эти символы, поскольку я не уверен, как я должен интерпретировать эту информацию на принимающей стороне в моем коде C ++.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Ваш скрипт печатает не обычный шестнадцатеричный код, а интерпретированную шестнадцатеричную строку.Некоторые из ваших шестнадцатеричных символов интерпретируются и отображаются в ASCII, другие - нет.Я проверил замену строк в моем интерпретаторе, и вы видите те же результаты:

>>> "%s".encode() % b"\xfa\x3f\x00"
b'\xfa?\x00'

, где \x3f - шестнадцатеричный код ASCII для ?.

0 голосов
/ 30 сентября 2018

Python пытается быть полезным (будь то на самом деле помогает спорно), печатая байт, которые соответствуют символу ASCII, как символ ASCII.

>>> t1 = b'test'
>>> t2 = b'\x74\x65\x73\x74'
>>> t1 == t2
True
>>> print(t1, t2)
b'test' b'test'
...