python使用struct进行二进制文件的读写

来源:互联网 发布:mac自带pages 编辑:程序博客网 时间:2024/06/07 22:59
1.struct pack/unpack的使用
python中提供了struct包,使用struct.pack/unpack函数可以进行二进制文件的操作。
在学习wireshark pcap文件格式过程中,由于其为二进制文件,不方便读取。于是使用python将其转换成16进制字符型文件输出,实现代码如下:
import structclass FileConvert(object):    ''' test python file'''    def __init__(self):        self.aa = 0        self.bb = 0            def convertPcapToHex(self,debugFlg=0):        infile = open("test.pcap",'rb')        outfile = open("testRslt.txt",'w')        a = int(0)        while True:            a = int(0)            a = infile.read(4)            #print(type(a))            #print(len(a))            dataSaveNum = len(a)            if not a:                break            if(len(a) == 4):                pass            elif(len(a) != 0):                loopTime = 4 - len(a)                while (loopTime > 0):                    loopTime = loopTime - 1                    a = a + b'\x00'            z = struct.unpack('i',a)            unNeg = z[0] & 0xFFFFFFFF #负数的验证            if(dataSaveNum == 4):                outfile.write("%08x"%unNeg)                dataSaveNum = 0                        while(dataSaveNum > 0):                saveData = unNeg&0xFF                #保留单个字节                #outfile.write("%08x"%unNeg)                unNeg = unNeg >> 8                dataSaveNum = dataSaveNum - 1                outfile.write("%02x"%saveData)                            if(debugFlg == 1):                outfile.write("\n")                        infile.close()        outfile.close()          def convertHexToPcap(self):        infile = open("testRslt.txt",'r')        outfile = open("another.pcap",'wb')        #for a in infile.read():        while True:            a = infile.read(8)            #print(type(a))            #print(b);            if not a:                break            if(len(a)!= 0):                #16进制转换10进制数                b=int(a,16)                covertValue = struct.pack("L",b)                outfile.write(covertValue)            #outfile.write("%s"%a)            #outfile.write("\n")        infile.close()        outfile.close()if __name__ == '__main__':    fileCvrt = FileConvert()    fileCvrt.convertPcapToHex()    fileCvrt.convertHexToPcap()
代码实现:将对应的pcap文件装换成16进制字符型txt文件,然后在将txt文件翻转为相应的pcap二进制格式文件。
2.几个问题注意点
负数的16进制格式输出,需要进行&0xFFFFFFFF的操作,否则输出为符号加十六进制数格式;文件的二进制读写格式需要设置'b'选项,二进制读取"rb",而进制写入"wb";pack/unpack使用时参数和对应类型的字节数需要对应,否则将会出现运行错误。