諸用でファイルを符号化して画像化したくなったので,その途中でやりました.
まずは以下のコードでファイルのバイナリをテキストとしてダンプします.
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文字だけ一応載せます.
1000100101010000010011100100011100001101000010100001101000001010000000000000000000000000000011010100100101001000010001000101001000000000000000000000000111001001000000000000000000000010000011100000100000000110000000000000000000000000110100110011101011110110111000000000000000000000001000000000000001001001010001000100000101010100011110000000000111101100101111011110100110010011011001011100011101110101001001111001011001010101110101010001101110111010101100011001001000000000000010000000001010100100101110001000000110001011011001001000101000100000010001111100101101001000001000111000111001100110010001100011000101100011110001010111100000001001010011110111100000111100111000010111000011111000100000111111111100101010011111110001100001111111101100111100001101001011100010000010001110000101001111001101011001000110100011110100010001010011000100101100010100011101000000000000100100010000001010111011000100110111000110101101110111101000011111011010110110111101111010100011110111000111001110011011111111110011
実際はこの01の羅列が718344[文字|バイト]ダンプされました.これはテキストの01なので,それぞれが1バイトを占有しており,ダンプされたファイルは元ファイルの8倍の容量になります.
なお,以下のコードでダンプした2進テキストファイルからもとのファイルを復元することができます.
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も取ってみます.
同じらしいです.
今回はダンプしたバイナリを記述したテキストファイルは,この後別のプログラムに読ませて利用するので,人間に見やすいようにフォーマットを行ってはいません.ダンプ中に標準出力に表示するものは一応カラムを分けていますので,書き換えればダンプ内容をフォーマットしたものにすることももちろん可能です.というか標準出力するならファイルに渡せばいいですね.