LoginSignup
2

More than 5 years have passed since last update.

pythonでファイルを2進ダンプして,復元する

Last updated at Posted at 2018-08-12

諸用でファイルを符号化して画像化したくなったので,その途中でやりました.
まずは以下のコードでファイルのバイナリをテキストとしてダンプします.

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 [バイナリ化対象ファイル] [ダンプ先ファイル]です.ダンプ先は新規作成されます.
試しに以下の画像ファイルをダンプしてみます.
image.png
ダンプされたファイルの先頭1000文字だけ一応載せます.

python.bin
1000100101010000010011100100011100001101000010100001101000001010000000000000000000000000000011010100100101001000010001000101001000000000000000000000000111001001000000000000000000000010000011100000100000000110000000000000000000000000110100110011101011110110111000000000000000000000001000000000000001001001010001000100000101010100011110000000000111101100101111011110100110010011011001011100011101110101001001111001011001010101110101010001101110111010101100011001001000000000000010000000001010100100101110001000000110001011011001001000101000100000010001111100101101001000001000111000111001100110010001100011000101100011110001010111100000001001010011110111100000111100111000010111000011111000100000111111111100101010011111110001100001111111101100111100001101001011100010000010001110000101001111001101011001000110100011110100010001010011000100101100010100011101000000000000100100010000001010111011000100110111000110101101110111101000011111011010110110111101111010100011110111000111001110011011111111110011

実際はこの01の羅列が718344[文字|バイト]ダンプされました.これはテキストの01なので,それぞれが1バイトを占有しており,ダンプされたファイルは元ファイルの8倍の容量になります.

なお,以下のコードでダンプした2進テキストファイルからもとのファイルを復元することができます.

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は以下のものとなります.
python.out.png

まあ,見た目には上で貼ったものと全く同じものが復元されました.コマンドラインでdiffも取ってみます.
image.png
同じらしいです.

今回はダンプしたバイナリを記述したテキストファイルは,この後別のプログラムに読ませて利用するので,人間に見やすいようにフォーマットを行ってはいません.ダンプ中に標準出力に表示するものは一応カラムを分けていますので,書き換えればダンプ内容をフォーマットしたものにすることももちろん可能です.というか標準出力するならファイルに渡せばいいですね.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2