2017-11-21 2 views
-2

으로 바꾸는 것은 어렵습니다. 이진수는 두 파일 (.bin)을 비교하고 두 파일의 차이점을 배열로 나열하는 것이 어렵습니다. 오프셋이 발생하는 주소를 나열하거나 오프셋 자체를 나열하십시오.파이썬에서 csv가 아닌 문자열을

지금 나는 파일을 읽고

import binascii

file1contents = binascii.hexlify(file1.read)

와 문자열의 콘텐츠를 추출하기 위해 관리했다 그리고 그것은 나에게 그러나이하는 파일에 포함 된 16 진수 값을 제공해야 file1contents = ""에 문자열로 저장됩니다. 그 때문에 문자열을 배열로 변환하려고 비교하기가 어렵습니다. 그런 다음 file2의 내용을 Array로 변환하고 차이점을 비교합니다. 그것은 시작이어야합니다.

문자열을 배열로 변환하는 데 도움을 줄 수 있습니까 ??

나는 이것을 file1contents = []에 저장하려고 시도했지만 그 중 어떤 것이 포함되어 있는지 보려면 print(file1contents)을 볼 수 없습니다.

+0

'binascii.hexlify (file1.read)'잘못이다, 난 당신 말은 가정'binascii.hexlify (file1.read())'. 'file1contents = []'는 빈리스트를'file1contents' 이름에 할당합니다. 파일 바이트를 16 진수로 변환하는 이유는 무엇입니까? 바이트로 직접 작업하지 않는 이유는 무엇입니까? 어떤 종류의 비교를하고 있습니까? 파일이 일치하지 않는 오프셋을 찾고 싶습니까, 아니면 좀 더 복잡한 것을 원합니까? –

+0

네 말이 맞습니다. 초기 파일은 .bin이므로 변환해야합니다. 문자열에서 바이트를 읽으면 ASCII 값으로 변환됩니다. 지금은 binascii에서 읽은 두 문자열을 비교하여 2의 차이 수를 계산할 수 있습니다.하지만 원하는 것은 주소 (예 : 1AB3C)에 차이가 있음을 나타낼 수 있어야한다는 것입니다. 그래서 이상적으로 file1과 file1의 배열의 차이점의 주소를 포함하는 1 개의 배열과 file2의 주소로 끝나기를 원합니다. 그런 다음 해당 값을 빼서 주어진 시간에 오프셋을 찾을 수 있습니다. – TatsuyaMiura

+0

죄송합니다, 당신은 나를 잃어 버렸습니다. 16 진수로 변환 된 2 개의 작은 데이터 파일의 예제를 게시 할 수 있습니까? –

답변

0

아래의 Python 3 코드는 16 진수 표기로 bytes 쌍의 개체를 만들고 두 개의 bytes 문자열이 다른 위치의 오프셋을 찾습니다.

# The input data in hex form, so it can be easily embedded in the script 
s0 = 'ffff fff8 ff82 f825 825e 25ef 5eff efff ffff fff8 ff82 f826 8260 260f 60ff 0fff ffff 35ff 5fff fff7' 
s1 = 'ffff fff1 ff82 f845 825e 25ef 500f efff 1ff1 fff8 ff82 f823 8260 260f 60ff 05f3 ffff 35ff 5ffe fff7' 
print(s0) 
print(s1) 

# Convert the data to bytes, so it's in the same form it would 
# be in if we'd read it from files opened in binary mode 
b0 = bytes.fromhex(s0) 
b1 = bytes.fromhex(s1) 
print(b0.hex()) 
print(b1.hex()) 

# Create a list of the offsets where the two bytes objects differ 
diff = [i for i, (u,v) in enumerate(zip(b0, b1)) if u != v] 
print(diff) 

# Print the bytes that differ, along with their offsets, all in hex 
for i in diff: 
    print('{:04x}: {:02x} {:02x}'.format(i, b0[i], b1[i])) 

출력

ffff fff8 ff82 f825 825e 25ef 5eff efff ffff fff8 ff82 f826 8260 260f 60ff 0fff ffff 35ff 5fff fff7 
ffff fff1 ff82 f845 825e 25ef 500f efff 1ff1 fff8 ff82 f823 8260 260f 60ff 05f3 ffff 35ff 5ffe fff7 
fffffff8ff82f825825e25ef5effeffffffffff8ff82f8268260260f60ff0fffffff35ff5ffffff7 
fffffff1ff82f845825e25ef500fefff1ff1fff8ff82f8238260260f60ff05f3ffff35ff5ffefff7 
[3, 7, 12, 13, 16, 17, 23, 30, 31, 37] 
0003: f8 f1 
0007: 25 45 
000c: 5e 50 
000d: ff 0f 
0010: ff 1f 
0011: ff f1 
0017: 26 23 
001e: 0f 05 
001f: ff f3 
0025: ff fe 
관련 문제