Chinaunix首页 | 论坛 | 博客
  • 博客访问: 473189
  • 博文数量: 51
  • 博客积分: 1056
  • 博客等级: 少尉
  • 技术积分: 676
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-10 22:53
文章存档

2018年(2)

2017年(1)

2013年(2)

2012年(9)

2011年(36)

2010年(1)

分类: 嵌入式

2018-10-04 14:15:22

又是一年的十一假期,去年此时写了锁屏汪,基本够用。
然而工作琐事太多,中年情绪低落。直到这个十一才有兴趣继续搞python。



这个工具能把二进制的文件,转换成文本文件,以16进制的形式呈现。
本来诸如hexdump 或者 MadEdit 之类的软件,都能做到这一点。然而hexdump只能在Linux下使用,MadEdit没有找到以16进制保存文件的选项。别人写的工具不放心怕有毒,所以只能自己写一个。

这样的转换有什么意义呢?比如想比较两个二进制文件的时候,就可以先将这两个文件转换成文本文件,然后就可以使用多种文本比较工具进行比较了。能直接比较二进制文件的工具很少,或者需要收费。

我怎么知道会有这种需求的呢?当然是来自无穷无尽的工作琐事。怎么发市场上的设备,就能出辣么多种问题,好好的板子就成了砖头。软件都没有能力去修改的BIOS固件,怎么就改变了内容。

人生苦短,我用python。带界面的程序不到100行,新手不到1天完成。
目前对python掌握不深,只能按字节转换,效率不高。做了个多线程处理防止GUI死掉。
打包好的工具只支持win7 64位系统


良心保证绿色无毒,因为是python打包体积小不了。

有源码可自行打包

点击(此处)折叠或打开

  1. import tkinter as tk
  2. from tkinter import ttk
  3. import tkinter.filedialog
  4. import threading
  5. import os

  6. #选择文件按钮的处理
  7. def selectFile():
  8.     resultlabel.configure(text="", wraplength=600)
  9.     selectfile = tkinter.filedialog.askopenfilename()
  10.     if selectfile != '':
  11.         s_entry.delete(0,tk.END)
  12.         s_entry.insert(0,selectfile)

  13.     src_file=s_entry.get()
  14.     if src_file != '':
  15.         target_file=src_file+".txt"
  16.         t_entry.delete(0, tk.END)
  17.         t_entry.insert(0,target_file)
  18.         convert_button.configure(state="enable")
  19.     else:
  20.         t_entry.delete(0, tk.END)
  21.         convert_button.configure(state="disabled")


  22. def bin2hextext(srcfile,targetfile):
  23. #二进制文件srcfile 转换成文本文件 targetfile,16进制显示,带偏移
  24.     i=1
  25.     try:
  26.         fsrc=open(srcfile,mode='rb')
  27.         ftarget= open(targetfile, mode='w')
  28.         iBytes = fsrc.read()
  29.         print("%08x:" % 0, file=ftarget, end='')
  30.         for s_byte in iBytes:
  31.             print("%02x" % s_byte,file = ftarget,end='')

  32.             if i%16 == 0:
  33.                 print("" , file=ftarget)
  34.                 print("%08x:" % i, file=ftarget,end='')
  35.             #刷新文件缓存 显示进度
  36.             if i%(128*1024) == 0:
  37.                 status = ('%.2f%%' % ((i/(os.path.getsize(srcfile)) * 100)) )
  38.                 ftarget.flush()
  39.                 resultlabel.configure(text=status)
  40.             i += 1
  41.         fsrc.close()
  42.         ftarget.close()
  43.         return "Convert file successfully"
  44.     except (OSError,TypeError) as reason:
  45.         return "Error"+str(reason)

  46. #创建线程进行处理 防止界面卡死
  47. def convert_thread_func(src,target):
  48.     res = bin2hextext(src, target)
  49.     resultlabel.configure(text=res, wraplength=600)
  50.     convert_button.configure(state="enable")

  51. #转换按键的处理
  52. def convert_func():
  53.     convert_button.configure(state="disabled")
  54.     resultlabel.configure(text="Processing ... ", wraplength=600)
  55.     sf = s_entry.get()
  56.     tf = t_entry.get()
  57.     t=threading.Thread(target=convert_thread_func,args=(sf,tf))
  58.     t.start()


  59. root=tk.Tk()
  60. root.title("bin2text V0.1 by: deep_pro") #第一个版本 2018-10-04
  61. tkinter.Label(root,text="source file:").grid(row=0,column=0)
  62. tkinter.Label(root,text="target file:").grid(row=1,column=0)
  63. tkinter.Label(root,text=" result :").grid(row=2,column=0)
  64. resultlabel=tkinter.Label(root,fg="red",text=" ")
  65. resultlabel.grid(row=2,column=1)
  66. s_entry=tkinter.Entry(width=99)
  67. t_entry=tkinter.Entry(width=99)
  68. s_entry.grid(row=0,column=1)
  69. t_entry.grid(row=1,column=1)

  70. ttk.Label(root,text=" ").grid(row=0,column=2)
  71. ttk.Label(root,text=" ").grid(row=1,column=2)
  72. src_button=ttk.Button(root,text="open",width=8,command = selectFile).grid(row=0,column=3)
  73. convert_button=ttk.Button(root,text="convert",width=8,state="disabled",command=convert_func)
  74. convert_button.grid(row=1,column=3)

  75. root.mainloop()

  76. #打包
  77. #pyinstaller -F test.py --noconsole -i 32.ico

阅读(5618) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~