python unpack pack
常规操作
https://blog.csdn.net/gracioushe/article/details/5915900
fmt = '!HBffffH'
rbuf = struct.unpack(fmt, udp_data) #udp_data 网络字节流
注1.q和Q只在机器支持64位操作系统有意义
注2.每个格式前可以有一个数字,表示个数
注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串
注4.P用来转换一个指针,其长度和机器字长相关
注5.最后一个可以用来表示指针类型的,占4个字节
为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而
struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:
如何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
本文来自博客园踩坑狭,作者:韩若明瞳,转载请注明原文链接:https://www.cnblogs.com/han-guang-xue/p/16545051.html