Уведомления

Группа в Telegram: @pythonsu

#1 Май 9, 2017 13:12:02

Geleosgeleos
Зарегистрирован: 2017-05-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнить 2 бинарных файла

Здравствуйте ,форумчане! Мне нужна помощь!
Имею 2 бинарных файла . К примеру,я открыл их в WinHex ,и в одном файле у меня код “ FF D8 FF”, а в другом “A1 B7 DD”. мне нужно,чтобы python сравнил их и разницу из второго файла кинул в новый документ. Т.е по моему примеру выйдет “”A1 B7 DD“. Если же будет похожий код, например в 1 файле ”DD АА D8“ ,а во втором файле ”DD AA D8 FF“, то должно вывести ”FF". В инете не нашел нужную инфу, да и + новичек в питоне
Помогите написать код!

Отредактировано Geleosgeleos (Май 9, 2017 13:15:20)

Офлайн

#2 Май 9, 2017 19:23:56

Geleosgeleos
Зарегистрирован: 2017-05-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнить 2 бинарных файла

нахимичил и попробовал сам написать:
Получилось так:

import struct
file1=open('d:\\22.jpg','wb')
file2=open('d:\\11.jpg','wb')
file1.write(struct.pack('x'))
file2.write(struct.pack('x'))
diff = difflib.ndiff(file1.readlines(), file2.readlines())
delta = ‘'.join(x for x in diff if x.startswith(’+ ‘))
f = open(’3.txt','w')
f.write(delta)


но ,во-первых, в строке“”“ file.write(struct.pack('x')) ”“” я не знаю,что написать,чтобы весь 16-ричный код вписало ,а не побайтово(ведь там может быть огромный 16-ричный код ,если открыть через WinHex) ( https://docs.python.org/3/library/struct.html , тема 7.1.2.2. Format Characters)
и во-вторых, у меня ругается питон на сам код((

Отредактировано Geleosgeleos (Май 9, 2017 19:28:32)

Офлайн

#3 Май 10, 2017 00:06:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Сравнить 2 бинарных файла

Geleosgeleos
Имею 2 бинарных файла . К примеру,я открыл их в WinHex ,и в одном файле у меня код “ FF D8 FF”, а в другом “A1 B7 DD”. мне нужно,чтобы python сравнил их и разницу из второго файла кинул в новый документ.
А зачем тебе это надо? Ты взялся за задачу, которая для тебя неподъёмная. Так ещё и неясно, где это может понадобиться. Скорее всего, то, что ты пытаешься сделать, делается вообще по-другому.

Судя по тому, что ты описал, если у тебя в одном файле “AA”, а в другом файле “AA 00 00 00 AA 00 00 00”, то в результирующий файл запишется “00 00 00 AA 00 00 00”. Так вот, какой в этом смысл? Что ты будешь делать со строкой, если она не целостная?

Так что выглядит всё так, будто ты делаешь что-то не то.



Офлайн

#4 Май 10, 2017 08:54:41

Geleosgeleos
Зарегистрирован: 2017-05-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнить 2 бинарных файла

Такое задание мне дал препод в целях изучения питона. Правда я тоже не знаю,в чем его смысл

Офлайн

#5 Май 10, 2017 09:12:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Сравнить 2 бинарных файла

Напиши тогда задание точно.



Офлайн

#6 Май 10, 2017 11:30:56

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Сравнить 2 бинарных файла

либо задание точно, либо менять препода



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#7 Май 10, 2017 14:05:46

Geleosgeleos
Зарегистрирован: 2017-05-04
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Сравнить 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))

Но появилась проблема. Всю разницу он выводит в окне,а мне надо,чтобы сохранил в текстовый файл. Можно ли это как-то сделать,не меняя код?
Попробовал ввести так:
 c = open('3.txt')
c.write("offset: {}\tchar: {:X}".format(offset, char))

но ,ясное дело,ничего не получилось(

Офлайн

#8 Май 10, 2017 14:24:47

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Сравнить 2 бинарных файла

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version