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

1.struct pack/unpack的使用
python中提供了struct包,使用struct.pack/unpack函数可以进行二进制文件的操作。
在学习wireshark pcap文件格式过程中,由于其为二进制文件,不方便读取。于是使用python将其转换成16进制字符型文件输出,实现代码如下:
import struct

class 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使用时参数和对应类型的字节数需要对应,否则将会出现运行错误。
<think>好的,用户想了解如何在Python中进行二进制文件读写操作。我需要根据提供的引用资料来整理回答。首先,引用[1]提到了二进制文件的基本概念,而引用[2]、[3]、[4]提供了具体的操作方法。 先确定用户需要的是基础操作步骤,可能包括打开文件、写入读取二进制数据。要注意二进制模式文本模式的区别,这点引用[3][4]都提到了,比如使用'wb''rb'模式,以及换行符处理的不同。另外,struct模块的使用在引用[2]中有示例,需要详细说明packunpack的用法。 用户可能对如何处理不同类型的数据(如整数、布尔值、浮点数)感兴趣,引用[2]中的例子正好覆盖了这些类型。同时,引用[3]提到二进制读写时不会自动转换换行符,这也是需要注意的点。还需要提到编码问题,如引用[4]中提到的使用encoding参数的情况,不过二进制模式下可能不需要,但用户可能会混淆文本二进制模式,所以需要区分清楚。 结构方面,应该分步骤讲解,先写后读,每个步骤给出代码示例,并解释关键点。比如打开文件时的模式选择,struct模块中格式化字符串的使用,以及读取时确定字节数的重要性。此外,注意事项部分需要总结常见问题,如模式区别、数据类型处理、指针位置等,帮助用户避免错误。 最后,生成相关问题时要围绕二进制文件操作的扩展,比如性能优化、异常处理、应用场景等,这样用户可以有进一步学习的路径。需要确保回答清晰,覆盖用户可能遇到的问题,并参考提供的引用资料来保证准确性。</think>### Python二进制文件读写操作详解 在Python中,二进制文件操作需要使用`b`模式标识,并借助`struct`模块处理结构化数据。以下是具体操作步骤注意事项: #### 一、二进制文件写入操作 1. **使用`wb`模式打开文件** ```python with open("data.bin", "wb") as f: # 文件操作代码块 ``` 2. **结构化数据打包** ```python from struct import pack # 打包整数、布尔值、浮点数(格式字符串i=4字节,?=1字节,d=8字节) packed_data = pack("i?d", 12345, True, 123.456) ``` 3. **写入二进制数据** ```python f.write(packed_data) # 总字节数=4+1+8=13 ``` #### 二、二进制文件读取操作 1. **使用`rb`模式打开文件** ```python with open("data.bin", "rb") as f: # 读取全部内容(注意字节数必须与写入时一致) raw_data = f.read(13) ``` 2. **解包二进制数据** ```python from struct import unpack a, b, c = unpack("i?d", raw_data) # 输出:12345 True 123.456 ``` #### 三、关键注意事项 1. **模式区别**:二进制模式不会自动转换换行符(`\n`保持为`0x0A`),而文本模式会进行换行符转换[^3] 2. **数据类型处理**:`struct`模块支持格式字符: - `i`:4字节整数 - `f`:4字节浮点数 - `d`:8字节双精度 - `?`:1字节布尔值 3. **指针位置**:使用`f.seek(0)`重置文件指针位置 4. **编码问题**:二进制模式不需要指定`encoding`参数,直接处理原始字节[^4] #### 四、综合示例 ```python from struct import pack, unpack # 写入 with open("binary_data.dat", "wb") as f: f.write(pack("i?d", 888, False, 3.1415926)) # 读取 with open("binary_data.dat", "rb") as f: data = unpack("i?d", f.read(13)) print(f"整数:{data[0]}, 布尔:{data[1]}, 浮点数:{data[2]:.6f}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值