- 浏览: 396975 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
lulu15634219680:
Eclipse设置行宽Maximum line width -
gakes:
有没有正确的啊
Android手机号码判断正则表达式 -
GhostFromheaven:
mooshadow 写道你好,首先感谢你的程序。我最近也碰到了 ...
java合并两个XML文件 -
mooshadow:
你好,首先感谢你的程序。我最近也碰到了这个问题,用了你的程序之 ...
java合并两个XML文件 -
sunnyting:
蛮靠谱!解决问题哈!
Android控制屏幕方向的改变
Python有一个binhex模块,在http://docs.python.org/library/binhex.html,用来Encode and decode binhex4 files。我没搞懂binhex4格式,搜索了很久,找到一个讲的相对比较好的http://www.5dmail.net/html/2006-3-2/200632222823.htm。
控制欲强的人,对未知或不可控充满恐惧。自己写个二进制与十六进制文件转换也许有点“重复发明轮子”的嫌疑,但是实现起来并没有想象的那么复杂,同时增加可控可用度,还有些意想不到的收获。
·filehelper
在《python判断对象是否为文件对象(file object)》中介绍了判断对象是否为文件对象(file object)的方法。这里就派上用场了。
还要介绍一个同时处理文件输入输出的帮助函数:
- def fileinoutpattern(inp, out, callback=None, inmode="r", outmode="wb"):
- """
- Make sure that 'inp' and 'out' has been 'converted' to file objects,
- and call 'callback' with them, finally clear it up.
- """
- # Set up
- fin = inp
- if not isfilelike_r(fin):
- fin = open(inp, inmode)
- fout = out
- if not isfilelike_w(fout):
- fout = open(out, outmode)
- # Call the 'callback'
- result = None
- if callback != None:
- result = callback(fin, fout)
- # Clear up
- if not isfilelike_r(inp):
- fin.close()
- if not isfilelike_w(out):
- fout.close()
- return result
def fileinoutpattern(inp, out, callback=None, inmode="r", outmode="wb"): """ Make sure that 'inp' and 'out' has been 'converted' to file objects, and call 'callback' with them, finally clear it up. """ # Set up fin = inp if not isfilelike_r(fin): fin = open(inp, inmode) fout = out if not isfilelike_w(fout): fout = open(out, outmode) # Call the 'callback' result = None if callback != None: result = callback(fin, fout) # Clear up if not isfilelike_r(inp): fin.close() if not isfilelike_w(out): fout.close() return result
1、判断inp是否为可读文件对象,如果不是就调用open,以inmode模式打开inp所指文件,并赋值给fin;
2、判断out是否为可写文件对象,如果不是就调用open,以outmode模式打开out所指文件,并赋值给fou;
3、如果callback不为None就调用它,并将返回结果保存在result;
4、如果fin是我们自己打开的就关闭它;如果传进来的就是文件对象,则不关闭,避免重复关闭和非用户想要的关闭;
5、如果fout是我们自己打开的就关闭它;如果传进来的就是文件对象,则不关闭,避免重复关闭和非用户想要的关闭;
6、将callback的结果返回
这个很重要,却很简单。当然也可以写成类,像Junit的TestCase那样的,写seup,tearDown方法,分别在调用callback前后执行,这里这个函数就够了。
·binhex
回到我们的主题,有了这个帮助函数,怎么把二进制文件转成十六进制形式呢?
- def binhex(inp, out, extfun=lambda x: x, blocksize=256):
- """
- Convert a binary file 'inp' to binhex file output.
- The inp may be a filename or a file-like object supporting read() and close() methods.
- The output parameter can either be a filename or a file-like object supporting a write() and close() method.
- """
- def _binhex(fin, fout):
- filesize = 0
- while True:
- chunk = fin.read(blocksize)
- if chunk:
- redlen = len(chunk)
- for b in chunk:
- fout.write('%02X ' % extfun(ord(b)))
- fout.write('\n')
- filesize += redlen
- else:
- break
- return filesize
- return fileinoutpattern(inp, out, _binhex, inmode="rb", outmode="w")
def binhex(inp, out, extfun=lambda x: x, blocksize=256): """ Convert a binary file 'inp' to binhex file output. The inp may be a filename or a file-like object supporting read() and close() methods. The output parameter can either be a filename or a file-like object supporting a write() and close() method. """ def _binhex(fin, fout): filesize = 0 while True: chunk = fin.read(blocksize) if chunk: redlen = len(chunk) for b in chunk: fout.write('%02X ' % extfun(ord(b))) fout.write('\n') filesize += redlen else: break return filesize return fileinoutpattern(inp, out, _binhex, inmode="rb", outmode="w")
1、需要inp和out两个参数,指明输入和输出文件,一个应用在每个字节上的函数extfun,默认块大小为256字节;
2、定义一个嵌套的函数_binhex,实现处理逻辑:每次读入blocksize大小的数据,逐字节调用extfun处理,将处理的结果转成十六进制形式,并写入fout;每blocksize数据后添加换行;返回处理字节数;
3、调用fileinoutpattern传递对应的参数;
这里我们就可以发现,有了这个帮助函数,我们的函数变得非常简洁,逻辑也十分清晰。
·hexbin
和binhex类似,将十六进制格式文本文件转成二进制文件也很简单:
- def hexbin(inp, out, extfun=slambda x: x):
- """
- Decode a binhex file inp to binary file outpu.
- The inp may be a filename or a file-like object supporting read() and close() methods.
- The output parameter can either be a filename or a file-like object supporting a write() and close() method.
- """
- def _hexbin(fin, fout):
- for line in fin:
- for i in range(len(line)/3):
- x = int(line[3*i:3*(i+1)], 16)
- fout.write(struct.pack('B', extfun(x)))
- fileinoutpattern(inp, out, _hexbin, inmode="r", outmode="wb")
def hexbin(inp, out, extfun=slambda x: x): """ Decode a binhex file inp to binary file outpu. The inp may be a filename or a file-like object supporting read() and close() methods. The output parameter can either be a filename or a file-like object supporting a write() and close() method. """ def _hexbin(fin, fout): for line in fin: for i in range(len(line)/3): x = int(line[3*i:3*(i+1)], 16) fout.write(struct.pack('B', extfun(x))) fileinoutpattern(inp, out, _hexbin, inmode="r", outmode="wb")
1、传人inp和out作为输入和输出文件,一个应用在转换后每个字节上的函数extfun;
2、定义一个嵌套函数_hexbin,实现处理逻辑:逐行读入,每3个字符一组,去掉空格,转成整数,在该整数上调用extfun,写入fout。
3、调用fileinoutpattern传递对应的参数;
·测试代码
- def test():
- """
- Test case.
- """
- # binhex test
- zipfilename = r"D:\2.zip"
- binhex(zipfilename, r"D:\2.1.txt")
- with open(zipfilename, "rb") as fin:
- binhex(fin, r"D:\2.2.txt")
- with open(r"D:\2.3.txt", "w") as fout:
- binhex(zipfilename, fout)
- with open(zipfilename, "rb") as fin, open(r"D:\2.4.txt", "w") as fout:
- binhex(fin, fout)
- # hexbin test
- txtfile = r"D:\2.1.txt"
- hexbin(txtfile, r"D:\2.1.zip")
- with open(txtfile, "r") as fin:
- hexbin(fin, r"D:\2.2.zip")
- with open(r"D:\2.3.zip", "wb") as fout:
- hexbin(txtfile, fout)
- with open(txtfile, "r") as fin, open(r"D:\2.4.zip", "wb") as fout:
- hexbin(fin, fout)
- def XOR(x):
- def _XOR(y):
- return x ^ y
- return _XOR
- xor0x13 = XOR(0x13)
- binhex(zipfilename, r"D:\2.encode.txt", extfun=xor0x13)
- hexbin(r"D:\2.encode.txt", r"D:\2.5.zip", extfun=xor0x13)
- print "OK."
def test(): """ Test case. """ # binhex test zipfilename = r"D:\2.zip" binhex(zipfilename, r"D:\2.1.txt") with open(zipfilename, "rb") as fin: binhex(fin, r"D:\2.2.txt") with open(r"D:\2.3.txt", "w") as fout: binhex(zipfilename, fout) with open(zipfilename, "rb") as fin, open(r"D:\2.4.txt", "w") as fout: binhex(fin, fout) # hexbin test txtfile = r"D:\2.1.txt" hexbin(txtfile, r"D:\2.1.zip") with open(txtfile, "r") as fin: hexbin(fin, r"D:\2.2.zip") with open(r"D:\2.3.zip", "wb") as fout: hexbin(txtfile, fout) with open(txtfile, "r") as fin, open(r"D:\2.4.zip", "wb") as fout: hexbin(fin, fout) def XOR(x): def _XOR(y): return x ^ y return _XOR xor0x13 = XOR(0x13) binhex(zipfilename, r"D:\2.encode.txt", extfun=xor0x13) hexbin(r"D:\2.encode.txt", r"D:\2.5.zip", extfun=xor0x13) print "OK."
1、这段测试代码用来测试“功能是否正确实现”已经足够了;
2、我们定义了XOR(x)的工厂方法,来生产异或函数对象,代码中我们生产了与0x13疑惑的函数对象xor0x13=XOR(0x13)
3、通过两次异或可以还原数据本身
·小结
AOP:面向切面编程,也许这个例子没有表现的那么明显。我们将“二进制/十六进制转换”与“文件(名)处理、文件关闭”等操作分开,作为该问题的两个不同切面。这样的好处就是,我们可以分开修改其中任意一个切面,而不影响或很少影响到另一个,换句话说给我们更大的灵活性和适应性,还有代码重用性。
嵌套函数:作为Python的一大特色,我们见到了它的用场。
工厂方法Factory Method:我们使用了XOR这个工厂方法来生产异或函数对象。
源代码下载binhex.zip
- binhex_GhostFromHeavn_.zip (5.3 KB)
- 下载次数: 0
发表评论
-
【Python】修改文件并立即写回到原始位置(inplace读写)
2012-07-31 07:52 6082很多应用多需要处理文件,而处理文件有一个固定的模式:打开文件, ... -
【Python】二进制文件与Base64编码文本文件转换
2012-07-29 18:06 12810前面的话 Python内置的base64模块,在这里http ... -
python判断对象是否为文件对象(file object)
2012-07-20 01:44 5931方法1:比较type 第一种方法,就是判断对象的type ... -
Python字典按值排序、包含字典的列表按字典值排序的方法
2012-06-19 00:57 39153#-*- encoding=utf-8 -*- impo ... -
Python单例模式终极版
2012-06-17 23:16 1625如果你真的想使用其他编程语言中类似的“单例模式”,你需要看: ... -
Python单例模式的4种实现方法
2012-06-17 22:47 31902#-*- encoding=utf-8 -*- print ... -
Python分段下载文件
2012-06-17 20:58 3543下载较大文件时分段下载会加速下载过程,几乎所有下载软件都有类似 ... -
Python如何拉平(flatten)嵌套列表(nested list)
2012-06-15 00:23 6780有时候会用到嵌套的列表(list),比如 [1, 2, [3 ... -
遍历python字典几种方法
2012-06-03 19:40 23893aDict = {'key1':'value1', 'key2 ... -
Python 迭代器 iteraor
2012-06-03 13:06 1943Python迭代器 iterator --by GhostF ... -
Ubuntu G++安装
2011-12-28 21:07 1373sudo apt-get install make gcc g ... -
Python多线程Socket程序例子
2011-12-11 16:38 6620如果没有multitask包,请从http://python- ... -
Python 多线程简单例子
2011-12-04 13:58 2119http://blog.csdn.net/ghostfromh ...
相关推荐
总结来说,将二进制文件转换为十六进制是计算机科学中的基本操作,它涉及文件I/O、数据类型转换以及可能的文本文件操作。了解这些知识对理解底层数据处理和软件开发至关重要。"VC 文件转换 bin 二进制 十六进制"这些...
这段代码定义了四个函数,分别实现了二进制到十进制、十进制到二进制、十六进制到十进制以及十六进制到二进制的转换。你可以根据需要调用这些函数进行数值的转换。 在实际应用中,程序员可能会遇到各种编码转换问题...
本话题主要涉及的是如何将一个包含十六进制数据的TXT文件读取并转换成十进制格式的TXT文件进行输出。这一过程需要理解二进制、十六进制和十进制之间的关系,以及如何在编程语言中进行这种转换。 首先,我们要了解...
以下将详细介绍数值与十六进制文本转换的相关知识点。 1. **数值系统**:计算机内部使用二进制(Base-2)来存储和处理信息。然而,人们通常使用十进制(Base-10)进行日常计算。此外,为了方便表示二进制数,十六...
而“文件”则涵盖了输入的jpg文件和输出的十六进制文本文件。 至于压缩包子文件的文件名称列表中的“J2F”,这可能是由于上传过程中的命名错误或者是某种特定的文件格式,但在这个上下文中,它并不直接关联到jpg...
Python 3.7.2 的中文文档包含了对官方标准库的详尽解释,特别是“Python二进制数据服务”这一部分,它涵盖了处理不同类型二进制数据的核心模块。这些模块对于进行系统级编程、网络通信、文件操作以及数据存储至关...
例如,在Python中,可以使用 `int(hex_number, 16)` 将十六进制转换为十进制,`bin(int(hex_number, 16))` 转换为二进制。了解这些基础转换对于学习和解决问题非常有帮助,尤其是在处理计算机数据和进行算法分析时。...
使用这样的工具,用户只需选择MP3文件,工具会自动完成转换并生成一个包含十六进制数据的文本文件。 在单片机端,十六进制文件可以被加载到闪存中,通过播放算法解码并逐字节地发送给音频DAC(数模转换器),从而...
"bin文件转换成十六进制数组"这个主题是关于将二进制数据转化为更适合编程和烧录的十六进制表示。这种转换对于嵌入式系统开发、固件更新、微控制器编程等工作尤为重要。 首先,我们要理解bin文件的性质。BIN是二...
2. **16进制转文件的原理**:将16进制字符串转换为文件,通常需要解析这些字符串,将每个16进制字符转换为其对应的二进制值,然后将这些二进制值组合成完整的字节序列。这个字节序列可以代表任何类型的数据,如文本...
首先,你需要将16进制文本转换成字节,然后按照BMP文件的结构排列这些字节,包括创建正确的文件头和信息头。这个过程中需要特别注意位深度(通常是24位,即每个像素有红、绿、蓝三个通道,每个通道8位)和颜色模型...
总结来说,读取BMP文件的十六进制代码涉及到理解BMP文件结构、使用编程语言的文件操作函数以及将二进制数据转换为可读的十六进制表示。这个过程可以帮助我们更好地理解和调试与图像相关的程序,同时对计算机视觉领域...
在计算机科学中,二进制是一种基础的数字系统,它仅使用两个符号:0 和 1,用于表示所有...总的来说,汉字转二进制涉及到字符编码理论、编码转换方法以及编程实践,这些都是理解和处理多语言文本时不可或缺的基础知识。
- 另一种优化是使用位运算,尤其是在二进制和十六进制之间转换时,可以利用位移操作提高效率。 6. **TestHexToDecimal** - 根据提供的压缩文件`TestHexToDecimal`,可能是包含一些测试用例或者代码示例,用于验证...
在计算机科学中,数据通常以不同的进制系统表示,如十进制(Decimal)、八进制(Octal)、十六进制(Hexadecimal)和二进制(Binary)。这些进制系统各有特点,适应不同的计算需求。本文将详细介绍如何在这些进制...
在解析二进制文件时,通过16进制转换,我们可以更容易地分析和理解数据结构。 提到的"16进制汉字互转.exe"文件可能是一个实用工具,它提供了一个图形化的界面,让用户能够方便地进行汉字和16进制之间的转换。使用...
在提供的压缩包文件"ASCII码与十进制十六进制互相转化例子"中,很可能包含了源代码或示例文件,用于演示如何实现这种转换功能。通过学习和研究这些代码,你可以了解如何在编程语言中实现这些转换操作,比如使用...
标题中的“奥贫血十六进制转换器”可能是指一个专门用于进行二进制与十六进制之间转换的工具。在IT领域,进制转换是一项基本技能,尤其在处理计算机数据时,不同进制间的转换非常常见。二进制(Binary)是计算机内部...
例如,在Python中,可以使用内置的`binascii`模块的`hexlify`函数将字节转换为十六进制字符串,而`unhexlify`函数则可以反向操作。在C++中,可以使用`std::stringstream`和`std::hex`格式控制符进行转换。 至于...
进制转换是计算机科学中的基础概念,涉及到二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)等不同数字系统间的转换。这些进制转换在编程、数据存储、硬件设计等多个IT领域都有广泛...