Форум сайта python.su
В общем задача такая: открыть 2 бинарных файла и,если так можно вообще, циклом+ветвлением сравнить каждый 16-ичный коды и ,если они не равны, выводить в новый текстовый документ.
Ну к примеру ,открываю 2 файла в WinHex . В одном файле код F8 A1 F6 ,а в другом F5 A2 F6. Программка должна сравнить и как результат вывести F6.
Пытаюсь создать саму программку и пробно вывести значения кода,но выводит какую-то билеберду:
f = open(r"1.png", "rb") f.readline(2) print (f.readline(2))
file1 = r"d:\\22.jpg" file2 = r"d:\\11.jpg" with open(file1, 'br') as of1, open(file2, 'br') as of2: l1 = of1.read() l2 = of2.read() f1_f2 = set(enumerate(l1)) - set(enumerate(l2)) f2_f1 = set(enumerate(l2)) - set(enumerate(l1)) for offset, char in sorted(f1_f2, key=lambda x: x[0]): print("offset: {}\tchar: {:X}".format(offset, char)) print() for offset, char in sorted(f2_f1, key=lambda x: x[0]): print("offset: {}\tchar: {:X}".format(offset, char))
Офлайн
Еще можно открыть так:
bytelist = bytearray() with open('01.mp3','rb') as bytes: for byte in bytes: bytelist.extend(byte) file=open('2.dat','wb') file.write(bytelist) file.close()
Офлайн
Geleosgeleos
В общем задача такая: открыть 2 бинарных файла и,если так можно вообще, циклом+ветвлением сравнить каждый 16-ичный коды и ,если они не равны, выводить в новый текстовый документ.
GeleosgeleosДве противоречащих друг другу фразы. В одной говорится одно, в другой - противоположное.
Ну к примеру ,открываю 2 файла в WinHex . В одном файле код F8 A1 F6 ,а в другом F5 A2 F6. Программка должна сравнить и как результат вывести F6.
GeleosgeleosКоторый оказался неправильным, потому что ты так и не поставил точно задачу. А писать десять неправильных программ нет никакого желания, потому что ты потом скажешь “а они тоже чуть-чуть неправильные”. Если ты задачу неправильно поставил, то у тебя по ней получаются неправильные программы. Вот кто-то неопытный тебе написал что-то впустую, можно ему только посочувствовать.
Раньше обращался с подобным вопросом, получил ответ в виде
Офлайн
py.user.nextСогласен,неправильно пример привел.
Отредактировано Geleosgeleos (Май 14, 2017 16:32:37)
Офлайн
А если оба файла имеют совсем разные коды, в новый файл выводить весь код 2 файла
Офлайн
Короче, надо сделать адресацию байтов в обоих файлах, потом сравнивать байты с одинаковыми адресами и неравные байты с их адресами выводить в файл. Если по адресу с различающимся байтом дальше идут также различающиеся байты, то все эти байты объединяются в цепочку байт с одним адресом.
Поэтому то, что он тебе предложил, неправильно работает алгоритмически. Тебе надо читать оба файла побайтово. Когда во втором файле находится байт, отличный от байта в первом файле (на той же позиции), то нужно его (и его адрес) записать в файл вывода и перейти в состояние присоединения байтов к цепочке. Это важный момент, нельзя их накапливать где-либо в оперативной памяти, так как их могут быть мегабайты. Когда при таком переборе (записи цепочки различающихся байт в файл вывода) встречается одинаковый байт, то нужно вернуться в прежнее состояние и продолжать сравнивать байты так, как в самом начале они сравнивались. При нахождении различающегося байта начинается новая цепочка и пишется в файл вывода, пока не встретится одинаковый байт.
Отредактировано py.user.next (Май 14, 2017 17:18:22)
Офлайн
py.user.nextТ.е правильно нахимичить с предыдущим кодом не получится*? а где об этом можно вообще узнать? потому что я не знаю,как это сделать просто физически. Ну раз ты говоришь об адресации,то на ум приходит список. т.е 2 файла сделать списками?
Короче, надо сделать адресацию байтов в обоих файлах, потом сравнивать байты с одинаковыми адресами и неравные байты с их адресами выводить в файл. Если по адресу с различающимся байтом дальше идут также различающиеся байты, то все эти байты объединяются в цепочку байт с одним адресом.Поэтому то, что он тебе предложил, неправильно работает алгоритмически. Тебе надо читать оба файла побайтово. Когда во втором файле находится байт, отличный от байта в первом файле (на той же позиции), то нужно его (и его адрес) записать в файл вывода и перейти в состояние присоединения байтов к цепочке. Это важный момент, нельзя их накапливать где-либо в оперативной памяти, так как их могут быть мегабайты. Когда при таком переборе (записи цепочки различающихся байт в файл вывода) встречается одинаковый байт, то нужно вернуться в прежнее состояние и продолжать сравнивать байты так, как в самом начале они сравнивались. При нахождении различающегося байта начинается новая цепочка и пишется в файл вывода, пока не встретится одинаковый байт.
Офлайн
или опять же взять множества и использовать .difference_update? тогда если так,то нужно что-то обратное этой функции взять,ибо мне нужно не совпадения а различия(
Отредактировано Geleosgeleos (Май 14, 2017 18:17:41)
Офлайн
GeleosgeleosОн загружает всё содержимое в память, что уже неправильно. Ты так возьмёшь пару файлов на сотни мегабайт или гигабайт и весь комп повиснет, потому что начнёт свопить на диск оперативку.
Т.е правильно нахимичить с предыдущим кодом не получится*?
GeleosgeleosВот эти строки загружают файлы в память целиком.l1 = of1.read() l2 = of2.read()
GeleosgeleosЭта билиберда прямо в файле записана, так что что ты пытаешься вывести - непонятно. Чтобы выводить байты, нужно их преобразовывать в hex-представление, а это делается через .format().
Пытаюсь создать саму программку и пробно вывести значения кода,но выводит какую-то билеберду:
Отредактировано py.user.next (Май 15, 2017 01:31:52)
Офлайн