Ответ 1
Все, что использует \x
, - это код escape строки, который используется для использования шестнадцатеричной нотации; другие escape-коды включают \n
для строк новой строки, \'
для литеральной цитаты и т.д. Строка python представляет собой последовательность байтов, и вы можете указать литеральные значения вне диапазона печати ASCII с использованием таких символов. Когда Python повторяет строковое значение на вас в интерпретаторе или вы печатаете результат вызова repr()
на строку, Python будет использовать такие escape-последовательности для представления любого байта, который не может быть напечатан как символ ASCII вместо:
>>> chr(65)
'A'
>>> chr(11)
'\x0b'
Функция hex()
возвращает очень специфическое строковое представление, равно как и .encode('hex')
с той разницей, что первая включает префикс 0x
. Существует два способа создания таких строковых представлений; используя форматы '%x'
и '%x'
, в которых для представления используются строчные или прописные буквы.
>>> hex(11)
'0xb'
>>> '\x0b'.encode('hex')
'0b'
>>> '%x' % (11,)
'b'
>>> '%X' % (11,)
'B'
Это все строковые представления, хотя (серия символов ASCII) и имеют то же отношение к исходным данным, что и str(number)
- к целочисленным данным; вы изменили тип и дальше от цели изменения порядка байтов.
Изменение части бинарной информации от маленького конца до big-endian требует, чтобы вы знали размер этой части информации. Если у вас есть короткие целые числа, вам нужно перевернуть каждые два байта, но если у вас нормальные (длинные) целые числа, то у вас есть 4 байта на одно значение, и вам нужно отменить каждый 4 байта.
Использование модуля struct
, я считаю, отличным подходом, потому что вы должны указать тип значения. Следующее интерпретировало бы xx
как бинарный конец unsigned short int, а затем упаковывает его обратно в двоичное представление в виде малознакового числа без знака short int:
>>> import struct
>>> xx = '\x03\xff'
>>> struct.pack('<H', *struct.unpack('>H', xx))
'\xff\x03'