У меня есть файл .bin, и я хочу просто перевернуть данные в шестнадцатеричном виде. Скажем, например, @ 0x10, он читает AD DE DE C0, хотите, чтобы он читал DE AD C0 DE.

Я знаю, что есть простой способ сделать это, но я новичок и просто изучаю Python и пытаюсь создать несколько простых программ, которые помогут мне справиться с повседневными задачами. Я хотел бы конвертировать весь файл таким образом, а не только 0x10.

Я буду конвертировать при начальном смещении 0x000000, а размер блока / длина будет 1000000.

Вот мой код, может быть, вы можете сказать мне, что делать. Я уверен, что просто не понимаю, и я новичок в программировании и Python. если бы вы могли помочь мне, я был бы очень признателен.

def main():
    infile = open("file.bin", "rb")
    new_pos = int("0x000000", 16)
    chunk = int("1000000", 16)
    data = infile.read(chunk)
    reverse(data)

def reverse(data):
    output(data)

def output(data):
    with open("reversed", "wb") as outfile:
        outfile.write(data)

main()

И вы можете увидеть модуль для реверса, я перепробовал много разных предложений, и он либо пропустит файл без изменений, либо выдаст ошибки. Я знаю, что модуль реверса сейчас пуст, но я пробовал разные вещи. Мне просто нужен обратный модуль для преобразования AB CD в CD AB. спасибо за любой вклад

РЕДАКТИРОВАТЬ: файл составляет 16 МБ, и я хочу изменить порядок байтов всего файла.

6
james28909 27 Янв 2013 в 04:18

4 ответа

Лучший ответ

В Python 2 двоичный файл читается как строка, поэтому срезы строк должны легко обрабатывать обмен смежных байтов:

>>> original = '\xAD\xDE\xDE\xC0'
>>> ''.join([c for t in zip(original[1::2], original[::2]) for c in t])
'\xde\xad\xc0\xde'

В Python 3 двоичный файл читается как байты. Только небольшая модификация необходима для построения другого массива байтов:

>>> original = b'\xAD\xDE\xDE\xC0'
>>> bytes([c for t in zip(original[1::2], original[::2]) for c in t])
b'\xde\xad\xc0\xde'

Вы также можете использовать коды формата < и > endianess в struct module для достижения того же результата:

>>> struct.pack('<2h', *struct.unpack('>2h', original))
'\xde\xad\xc0\xde'

Счастливая замена байтов :-)

9
Raymond Hettinger 27 Янв 2013 в 03:13

В Python 3.4 вы можете использовать это:

>>> data = b'\xAD\xDE\xDE\xC0'
>>> swap_data = bytearray(data)
>>> swap_data.reverse()

Результат

bytearray(b'\xc0\xde\xde\xad')
12
grawee 6 Авг 2015 в 12:42

В Python есть оператор списка для обращения к значениям списка -> nameOfList [:: - 1]

Итак, я мог бы сохранить шестнадцатеричные значения в виде строки и поместить их в список, а затем попробовать что-то вроде:

def reverseList(aList):
rev = aList[::-1]
outString = ""
for el in rev:
    outString += el + " "
return outString
0
Tim Morgan 27 Янв 2013 в 01:23
data = b'\xAD\xDE\xDE\xC0'
reversed_data = data[::-1]
print(reversed_data)
# b'\xc0\xde\xde\xad'
6
吴毅凡 8 Окт 2017 в 06:46