#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' 28-11-22 Affichage d'un fichier en hexadecimal / ascii avec colorisation de valeurs particulières. ''' import sys, re from tkinter import * from tkinter.scrolledtext import ScrolledText #from tkinter.simpledialog import askstring # fin de ligne eol="\n" # barre pour faciliter le comptage des octets sur l'affichage barre=8*" "+8*("::" + 3*"--")+" "+8*(":" + 3*"-")+eol def cnv_ascii(buf): txt= buf.decode(encoding='ascii',errors='replace') return re.sub(eol," ",txt) # preparation de la ligne avec l'adresse, le bloc hex, le bloc ascii def genere_ligne(adr,buf): ad= format(adr,'6d') t1= buf.hex() t2= cnv_ascii(buf) return ad+': '+t1+' '+t2 def godump(ev=""): fx=ficx.get() adx=adrx.get() vx=valx.get() tbv=re.split("\W+",vx) #print(tbv) try: fp=open(fx,mode='rb') # on ouvre le fichier except: tx1.insert("1.0",fx+" -- Fichier non trouvé."+eol+eol); return adr1=adx fp.seek(adx) bb= fp.read(1024) if not bb : return txt=''; pt=0 for yy in range(32): if not (yy % 8) : txt+= barre txt += genere_ligne(adr1, bb[pt:pt+32])+eol adr1 +=32; pt +=32 # on place le texte dans le widget tx1.delete("1.0",END) tx1.insert("1.0",txt) # on colorise certaines valeurs colorise(tbv[0],'c1') colorise(tbv[1],'c2') colorise(tbv[2],'c3') def colorise(val,coul): start='1.0' lnv= len(val) while 1 : idx = tx1.search(val, start, stopindex=END) if not idx: break tag_end=tag_end = f"{idx}+{lnv}c" tx1.tag_add(coul, idx, tag_end) start = tag_end ################## PROGRAMME #################### w1= Tk() ficx=StringVar() adrx= IntVar() valx=StringVar() w1.title("Examiner un fichier en Hex/Ascii") Label(w1,text="Fichier", width=8).grid(row=0,column=0) Label(w1,text="Start", width=8).grid(row=0,column=1) Label(w1,text="3 motifs à mettre en évidence").grid(row=0,column=2) # on recupere le nom du fichier e1 = Entry(w1,textvariable=ficx, width=60) e1.grid(row=1,column=0) e1.focus_set() # on recupere l'adresse de départ e3 = Entry(w1,textvariable=adrx, width=8) e3.grid(row=1,column=1) # on recupere les valeurs a mettre en couleur e2= Entry(w1,textvariable=valx, width=10) e2.grid(row=1,column=2) valx.set("0a 0d 0f") Button(w1,text="ok", command=godump ).grid(row=1,column=3) w1.bind("", godump) # mise en place de la zone pour les résultats tx1= Text(w1,bg='silver', width=110, height=37) tx1.grid(row=2, columnspan=3) # definition des couleurs utilisables sur cette zone tx1.tag_configure('c1', foreground='red') tx1.tag_configure('c2', foreground='blue') tx1.tag_configure('c3', foreground='green') w1.mainloop()