祝各位道友念头通达
GitHub Gitee 语雀 打赏

python unpack pack

常规操作

https://blog.csdn.net/gracioushe/article/details/5915900

fmt = '!HBffffH'
rbuf = struct.unpack(fmt, udp_data)  #udp_data 网络字节流

image

注1.q和Q只在机器支持64位操作系统有意义
注2.每个格式前可以有一个数字,表示个数
注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
注4.P用来转换一个指针,其长度和机器字长相关
注5.最后一个可以用来表示指针类型的,占4个字节
为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而

struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:
image

如何pack如何将文件二进制流读取并按照指定的长度打包

with open(self.update_file, "rb") as cfs:
	cdata = cfs.read(1400)
	format = "<HB1400s"  #2 1 4 4 4 1400 2  当cdata 不够 1400个字节的时候,会填充零字节
	sdata = struct.pack(format, 0xc8c9, 0x03, cdata)

以下代码实现将一个文件二进制流读取,并按照指定长度向网络中发送出去

def sendFile(self):
    # 发送文件
    with open(self.update_file, "rb") as cfs:
        offset = 0;
        flen = os.path.getsize(self.update_file)
        print("文件总大小-> " + str(flen))
        clen = 1400
        while True:
            flag = 0;
            sleep(0.08)
            if(self.isclose != 0):
                break
            cnt = offset * clen
            cfs.seek(cnt)
            offset = offset + 1
            if(cnt + 1400 < flen):
                self.sendFileProsee = round((cnt*1.0)/(flen*1.0), 4)     #进度条
            else:
                flag = 1
                clen = flen - cnt
                cnt = cnt + clen
                self.sendFileProsee = 1     #进度条
            
            print("flen:" + str(flen) + ", offset: " + str(offset) + ", clen: " + str(clen) + ", cnt: " + str(cnt))
            cdata = cfs.read(clen)
            format = "<HBIII1400sH"  #2 1 4 4 4 1400 2 
            sdata = struct.pack(format, 0xc8c9, 0x03, flen, clen, offset, cdata, 1417)
            sendUdpTo(self, sdata)
            if(flag):
                break
posted @ 2022-08-02 20:15  韩若明瞳  阅读(178)  评论(0编辑  收藏  举报