Преобразовать строку в шестнадцатеричный в Python
Вот моя функция, которая создает сообщение из массива. Есть два типа проверок:
Проверьте "C", "G", "A" -> [("{'chip_id': '00012345', 'check_type': 'C'}", 1494273855.0)]]
Проверьте "P" -> ["{'широта': 43.5529109, 'долгота': 1.4910036, 'тип проверки': 'P'}", 1494273855.0]
def build(self, checks):
#checks is an array.
# #1- On transforme notre check en tuple
_tuple = checks[0]
#2- On recupere le couple id/type en string. On recupere le timestamp en string
_type = _tuple[0]
_timestamp = _tuple[1]
#Selection taille message d apres le type element
e = _type.find("type': '")
type = _type[e+8]
if type == "C" or type == "A" or type == "G":
start = _type.find("'chip_id': '")
stop = _type.find("', '")
chip_id = _type[start + 12:stop]
a = int(binascii.hexlify(chip_id))
msg_build = bytes(type) + hex(int(_timestamp)) + hex(struct.unpack('<I', struct.pack('<f', a))[0]) + bytes(b"P")
if type == "P":
start_lat = _type.find("'latitude': ")
end_lat = _type.find(", 'long")
latitude = float(_type[start_lat+12:end_lat])
start_long = _type.find("'longitude': ")
end_long = _type.find(", 'chec")
longitude = float(_type[start_long+13:end_long])
msg_build = bytes(type) + hex(int(_timestamp)) + hex(struct.unpack('<I', struct.pack('<f', latitude))[0]) + hex(struct.unpack('<I', struct.pack('<f', longitude))[0])
return msg_build
С помощью этой функции я могу преобразовать любые проверки в нужное сообщение. Кажется, работает довольно хорошо.
"C" check_type возвращает сообщение типа "C0x5910e6b80x592c40b7P".
"P" check_type возвращает сообщение типа "P0x5910ca4b0x420f12d00x428fca07"
Но, с другой стороны, мне нужно будет расшифровать это сообщение и получить всю информацию. Я могу сделать это для моих сообщений "P".
Для check_type "C" у меня есть некоторые проблемы, когда мне нужно расшифровать.
Давайте возьмем пример, я построю следующую проверку:
[("{'chip_id': '00014876', 'check_type': 'C'}", 1494279864.0)]]
Где "chip_id" всегда 8 цифр, "check_type" будет "C", "G" или "A" (здесь это не имеет значения) и отметка времени.
Моя функция возврата:
C0x5910e6b80x592c40b7P
- С мой тип.
- 0x5910e6b8 - моя временная метка. Если я делаю "int("0x5910e6b8", 0)", я нахожу "1494279864" отметку времени в проверке
- 0x592c40b7 - мой чип_ид.
Это моя проблема. Я мог бы зашифровать мой chip_id с помощью:
- a = int (binascii.hexlify (chip_id))
hex(struct.unpack('<I', struct.pack('<f', a))[0])
Но я не могу найти, как получить мой chip_id ("00012345") из шестнадцатеричного (" 0x592c40b7") в зашифрованном сообщении.
Кто-нибудь знает, как я мог это сделать?
1 ответ
Соответствует ли это требованиям:
msg = ''.join(["{:02X}".format(e) for e in bytearray("Hello, world!")])
''.join([chr(int(msg[i:i+2], 16)) for i in range(0, len(msg), 2)])
?