Частично проблема заключается в том, что результатом "%x" % mime
является строка пар шестнадцатеричных символов - "d101085402656e"
в этом случае - которая представляет значение целого числа mime
в этом формат, так что это то, что записывается в файл. Однако необходимы фактические значения байтов, которые составляют само целое число.
В Python 3 это можно легко решить, используя вместо этого встроенный метод с именем to_bytes()
, который был добавлен к типу int
в этой версии, но в Python 2.x он должно быть сделано по-другому.
Существует аналогичная проблема из-за использования str(payload).encode("hex")
, которое также возвращает шестнадцатеричное строковое представление, а не фактические значения байтов каждого символа уже в payload
, что и нужно. К счастью, в этом случае то, что должно быть, может быть легко достигнуто с помощью встроенного bytearray
класса Python 2.x имеет.
Ниже я написал версию функции, опубликованной как часть ответа на связанный вопрос , который может решить проблему со значением mime
.
После этого определения функции приведен код, показывающий, как использовать ее в этом случае вместе с классом bytearray
для получения надлежащих двоичных данных, записанных в файл.
def int_to_bytes(n, minlen=0):
""" Convert integer to bytearray with optional minimum length.
"""
if n > 0:
arr = []
while n:
n, rem = n >> 8, n & 0xff
arr.append(rem)
b = bytearray(reversed(arr))
elif n == 0:
b = bytearray(b'\x00')
else:
raise ValueError('Only non-negative values supported')
if minlen > 0 and len(b) < minlen: # zero padding needed?
b = (minlen-len(b)) * '\x00' + b
return b
mime = 58829405413336430
payload = 'c9999'
with open('testhex', 'wb') as fw_file:
fw_file.write(int_to_bytes(mime))
fw_file.write(bytearray(payload))
Вот шестнадцатеричный дамп содержимого созданного им файла testhex
(с Python 2.7.15):
00000000h: D1 01 08 54 02 65 6E 63 39 39 39 39 ; Ñ..T.enc9999