Как Python преобразует необработанную строку в шестнадцатеричный формат?

У меня есть некоторая необработанная строка, которую я конвертирую в шестнадцатеричное

>>> word_str = "4954640000005200000005a7a90fb36ecd3fa2ca7ec48ca36004acef63f77157ab2f53e3f768ecd9e18547b8c22e21d01bfb6b3de325a27b8fb3acef63f77157ab2f53e3f768ecd9e185b7330fb7c95782fc3d67e7c3a66728dad8b59848c7670c94b29b54d2379e2e7a"
>>> hex_str = word_str.decode('hex')
>>> hex_str = "ITd\x00\x00\x00R\x00\x00\x00\x05\xa7\xa9\x0f\xb3n\xcd?\xa2\xca~\xc4\x8c\xa3`\x04\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85G\xb8\xc2.!\xd0\x1b\xfbk=\xe3%\xa2{\x8f\xb3\xac\xefc\xf7qW\xab/S\xe3\xf7h\xec\xd9\xe1\x85\xb73\x0f\xb7\xc9W\x82\xfc=g\xe7\xc3\xa6g(\xda\xd8\xb5\x98H\xc7g\x0c\x94\xb2\x9bT\xd27\x9e.z"

Глядя на таблицу ascii, я предполагаю, что она принимает два числа за раз и преобразует их на соответствующее значение из таблицы ascii, например

49 -> I
54 -> T
64 -> d
00 -> \x00
00 -> \x00

Но в какой-то момент это правило нарушается

52 -> \x00R (00 and 52)

Затем приступает к съемке двух чисел одновременно и

00 -> \x00
00 -> \x00
00 -> \x00
05 -> \x05
a7 -> \xa7
a9 -> \xa9
0f -> \x0f

Здесь требуется 2 пары (b3 а также 63) в то же время вместо одного, в котором он не конвертируется b3 с соответствующим значением (из расширенной таблицы ASCII)

b36e -> \xb3n

Здесь CD становится \xcd?

 cd ->  \xcd?

Моя цель — реализовать то же самое (variable.decode (‘hex’)) в C ++, но мне нужно понять, что происходит, какой алгоритм здесь использовался?

0

Решение

То, о чем вы спрашиваете, это представление строки для печати в удобочитаемом формате. Сама строка содержит значения каждого байта в исходной шестнадцатеричной строке (каждый байт выводится из двух исходных цифр).

Некоторые байты в вашей строке являются символами, которые не могут быть напечатаны или не представлены в ASCII. Для них Python использует escape-код: \x затем следуют две оригинальные шестнадцатеричные цифры.

В вашем примере b36e -> \xb3nPython преобразует b3 в \xb3, Следующий байт, 6e, ASCII для строчных n и так как это для печати, это происходит через дословно. Python не «берет их по два одновременно»; каждый байт обрабатывается отдельно.

Таким образом, в основном, если вы хотите «сделать то же самое» в C ++, вам нужно добавить все символы в диапазоне от 32 до 126 (включительно) дословно и все, что находится за пределами этого диапазона, используя \x побег.

Я не уверен, что вы действительно хотите сделать то же самое в C ++; возможно, вы можете объяснить Зачем Вы хотите создать строковое представление Python в C ++.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]