2 cool navy2011 cool_navy2011 于 2015.07.05 15:55 提问

python struct 解封包变长字符串 1C

码友们好,我想实现变长struct的解封包,功能类似下面这样,当然这样还行不通

 #一个变长字串
s='string data'
#在串的前面写入串的长度然后写入串本身
buf=struct.pack('i'+str(len(s))+'s', len(s), s)
#网路接受。。。
#先读出串的长度,然后按这个长度读出串
l,ss=struct.unpack('i'+str(l)+'s', buf)

在此,先谢谢你的关注,如有指教不胜感激。

3个回答

91program
91program   Ds   Rxr 2015.07.05 16:02

直接使用 s='0011string data' 不行吗?其中 0011 为字符串的长度,其固定占 4 个字节只是为了好解析。

cool_navy2011
cool_navy2011 是这个意思,但解析时怎么先把这个长度取出来呢
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.05 17:29

你的长度字段应该是一个固定位数数据,这样你接收到数据后,知道先获取对应长度部分数据,然后根据长度再读取后面多长的数据内容。

cool_navy2011
cool_navy2011   2015.07.11 20:03

已经解决了,谢谢各位,不好意思没有及时回复,列出解决方案
#一个变长字串
s='string data'
#在串的前面写入串的长度然后写入串本身
buf=struct.pack('i'+str(len(s))+'s', len(s), s)
#网路接受。。。
#先读出串的长度,然后按这个长度读出串
idx=0
l,=struct.unpack('i', buf[idx:idx+4])
idx+=4
ss,=struct.unpack(str(l)+'s', buf[idx:idx+l])
idx+=l
...

lpfly
lpfly 另外,你的pack的格式最好是"!..."加个感叹号,这样保证你序列化后的字节是big endian还是small endian跟系统无关
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片