python으로 파일을 2진 덤프, 복구

9004 단어 Python
여러 가지 방법으로 파일을 인코딩해서 이미지화하고 싶어서 중간에 했어요.
우선 다음 코드로 파일의 이진법을 텍스트 저장합니다.
genbin.py
import sys

argv = sys.argv
argc = len(argv)

if argc < 2:
    print("利用方法:python genbin.py [inputfile] [outputfile]")
    quit()

file_binary = ''

count = 0

with open(argv[1], 'rb') as f:
    for c in f.read():
        crbin = bin(c)[2:]
        if len(crbin) < 8:
            crbin = ((8 - len(crbin)) * '0') + crbin
        print(crbin, end='')
        file_binary += crbin
        count += 1
        if count % 6 == 0:
            print()
        else:
            print(' ', end='')

print(count*8)

with open(argv[2], 'w') as f:
    f.writelines(file_binary)
사용 방법은 코드에서 보듯이 python genbin.py [バイナリ化対象ファイル] [ダンプ先ファイル]입니다. 저장소는 새로 제작되었습니다.
아래의 그림 파일을 뒤집어 보세요.

덤프 파일의 시작 부분에 있는 1000자만 나열됩니다.
python.bin
1000100101010000010011100100011100001101000010100001101000001010000000000000000000000000000011010100100101001000010001000101001000000000000000000000000111001001000000000000000000000010000011100000100000000110000000000000000000000000110100110011101011110110111000000000000000000000001000000000000001001001010001000100000101010100011110000000000111101100101111011110100110010011011001011100011101110101001001111001011001010101110101010001101110111010101100011001001000000000000010000000001010100100101110001000000110001011011001001000101000100000010001111100101101001000001000111000111001100110010001100011000101100011110001010111100000001001010011110111100000111100111000010111000011111000100000111111111100101010011111110001100001111111101100111100001101001011100010000010001110000101001111001101011001000110100011110100010001010011000100101100010100011101000000000000100100010000001010111011000100110111000110101101110111101000011111011010110110111101111010100011110111000111001110011011111111110011
실제로 이 01의 나열은 718344[문자|바이트]로 저장되었다. 텍스트의 01이기 때문에 각각 1바이트를 차지하고 저장된 파일의 용량은 원시 파일의 8배이다.
또한 다음 코드로 저장된 이진 텍스트 파일에서 원본 파일을 복구할 수 있습니다.
revbin.py
import sys
import struct

argv = sys.argv
argc = len(argv)

if argc < 2:
    print("利用方法: python rebin.py [inputfile] [outputfile]")
    quit()

binary = ''
with open(argv[1], 'rb') as inf:
    binary = inf.readline()
binary_str = binary.decode()

with open(argv[2], 'wb') as outf:
    for i in range(int(len(binary_str) / 8)):
        # print(hex(int(binary_str[:8], 2)) ,end="")
        outf.write(struct.pack("B", int(binary_str[:8], 2)))
        binary_str = binary_str[8:]

여기python revbin.py python.bin python.out.png로 복원해 보세요.
출력python.out.png은 다음과 같다.

응, 외관이 위에 붙인 것과 완전히 같은 것을 회복해서 지령줄에서도 diff를 뽑았어.

같은 것 같은데.
이번에 저장된 이진법이 기재된 텍스트 파일은 이후 다른 프로그램이 읽고 이용하기 때문에 인간 식별에 편리한 형식이 없다.고쳐 쓰면 당연히 기록 내용을 포맷하거나 표준 출력을 하려면 파일에 넘기면 된다.

좋은 웹페이지 즐겨찾기