Преобразовать строку в шестнадцатеричный в 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)])

?

Другие вопросы по тегам