バイナリ・ビューア 【Python】

tkinter

Python の tkinter を使って、バイナリビューアを作成しましたので公開します。
以下の環境で動作確認をしています。

環境: Windows 10、Python 3.x

背景

時々、音声データや画像データなどについて、バイナリでどうなっているか知りたくなることがあります。そこで、Python でバイナリービューアを作成しました。
これで任意のデータについて、バイナリで参照できるようになります。

使い方

① 任意のフォルダを作成し、その中に binary_viewer1.py 等の名前でテキストファイルを作成してください。
② ①のテキストファイルに下記のサンプルコードを貼りつけて保存してください。
③ ①のフォルダの中に “data1” という名前でフォルダを作成してください。このフォルダの中に任意のファイルを入れてください。
④ コマンドプロンプトから、②のファイルを実行してください。

まとめ

任意のファイルについて、Python でバイナリデータで参照できるようになりました。
ファイルフォーマットの仕様を調べていけば、バイナリデータも自由自在かなというところです。
ファイルが大きいと読み込みに時間がかかりますけれども。

関連リンク
・ 【tkinter】 フォルダビューアの作り方 【Python】

サンプルコード

import os 
import glob 
import tkinter as tk1
import tkinter.ttk as ttk1 

def read_binary1( file1 ): 
    data1 = [] 
    with open( file1, 'rb' ) as f1: 
        while True: 
            b1 = f1.read(1) 
            if not b1: 
                break 
            data1.append( b1 ) 
    return data1

def show_binary1( file1 ): 
    bytes1 = read_binary1( file1 )
    str1 = "0000" 
    str2 = "" 
    str3 = "" 
    for i1 in range( len( bytes1 ) ): 
        b1 = bytes1[i1]
        str2 = str2 + b1.hex() + " " 
        chr1 = str( b1 ).split("'")[1] 
        if '\\' in chr1: 
            chr1 = "." 
        str3 = str3 + chr1 
        if (i1 % 16) == 15: 
            str1 = str1 + "  " + str2 + " " + str3 + "\n" + "{:04d}".format( i1+1 ) 
            str2 = "" 
            str3 = "" 
        elif (i1 % 8) == 7: 
            str2 = str2 + " " 
    str1 = str1 + "  " + str2 + " "*(16 * 3 - len(str2)) + "  " + str3 + "\n" 
    textbox2.delete( 1.0, tk1.END ) 
    textbox2.insert( 1.0, str1 ) 

def show_file1( self ): 
    n1 = listbox1.curselection() 
    file1 = listbox1.get( n1[0] ) 
    textbox1.delete( 0, tk1.END ) 
    textbox1.insert( 0, file1 ) 
    textbox2.insert( 1.0, "" ) 
    file1 = path1 + file1 
    show_binary1( file1 ) 
    return 

path1 = os.path.dirname(__file__) + "\\data1\\"    
list0 = glob.glob( path1 + "*.*" ) 

frame1 = tk1.Tk()
frame1.title( 'binary_viewer v0.1' ) 
frame1.geometry( "600x550+100+100" ) 

listbox1 = tk1.Listbox( frame1, selectmode = 'single' )
listbox1.place( x=10, y=10, width=260, height=100 ) 

scrollbar1 = tk1.Scrollbar( frame1, orient = 'v', command = listbox1.yview )
scrollbar1.place( x=270, y=10, height=100 ) 
listbox1.configure( yscrollcommand = scrollbar1.set ) 

for list1 in sorted( list0 ): 
    list2 = os.path.split( list1 )[1] 
    listbox1.insert('end', list2 ) 

listbox1.bind( '<<ListboxSelect>> 	 	 	 	 	 	', show_file1 )

textbox1 = tk1.Entry( master=frame1 ) 
textbox1.place( x=300, y=10, width=260 ) 

textbox2 = tk1.Text( frame1, height=10 )  
textbox2.place( x=10, y=120, width=550,  height=400 ) 

scrollbar2 = ttk1.Scrollbar( frame1, orient = 'v', command = textbox2.yview ) 
textbox2.configure( yscrollcommand = scrollbar2.set ) 

scrollbar2.place( x=560, y=120, height=400 ) 

frame1.mainloop()
タイトルとURLをコピーしました