近日,需要用Python读取二进制文件(见上图),然后解析出想要的数据,转化成16进制,在显示出来

    1. fp = open(path,'r+')   
    2.   
    3. s= fp.read(ioneblock)         
    4.   
    5.   
    6. while '' != s  :  
    7.       
    8. 'hex')  
    9. print 'first t is %t'%t

     

    遇到到一个莫名的问题,遇到'0x1A'的字节就会读不出来,费了差不多一天时间,发现Python会将这个字符认为是文档结束符EOF。

     

     

     解决这个问题的方法就是,二进制文件就用二进制方法打开。


    将 fp = open(path,'r+') 改为

    fp = open(path,'rb')


    问题得到解决

     


    利用Python读取二进制文档时,如一些程序的计算结果,一般要在在打开文件后,利用struct模块中的unpack方法获取真实数据。

    import os
     import structfp=open(filename,"r")
     data = struct.unpack("f",fp.read(4))

    这几行语句实现了从文件中读取4个字节数据并转化为float数。
    一般这样执行时没有问题的,fp.read(4)返回的是4个字节对应的字符,unpack将这4个字符按照float格式进行翻译。

    但是,在数据处理中发现,如果一个数据的第一个字节是"/x1A",那么Python就会将这个字符认为是文档结束符EOF,从而不再读取后面三个数据,譬如
    在二进制文件中存在如下从低位向高位排列的数据
    1A 2F 3D 10 2C 12 2E 76
    那么第一次读4个字节时,会读不出任何数据。加入这次读取数据仍然能够完成,那么接下来读取的下4个字节数据就是2F 3D 10 2C了,从而会导致数据出现根本错误。

    解决这个问题的方法就是,二进制文件就用二进制方法打开。

    fp=open(filename,"r")

    修改为

    fp=open(filename,"rb")

    上面的错误就不会发生了。
    第一次读取4个字节时,是按照二进制位进行读取的,fp.read(4)只是返回32位数据,而不会将其翻译成对应的字符,从而避免了上面的错误。

     

     

    http://mail.python.org/pipermail/python-bugs-list/2004-February/022213.html上面的链接指出了这个问题,但是后面的解释并不十分合理