关于python struct.pack打包嵌套结构数据的问题

AlexChenLei 2014-07-07 10:46:27
用struct.pack进行数据打包并发送至网络
对端是c写的服务器, 接受的数据结构是一个嵌套的数据结构
typedef struct HeadTag {
unsgined short length;
unsigned short dwId;
} HeadT;

typedef struct MsgTag {
HeadT head;
int content Id;
char name[6];
} MsgT

对于这种嵌套的结构如何进行数据打包?
我原本想通过struct.pack打包head数据, 然后再将head数据打包到msg中, 但是好像没法用:
Head = struct.pack('HH', 1, 2)
msg = struct.pack('4si10s', Head, 19, "abcdef")
但是报错:
struct.error: argument for 's' must be a string

想问问除了将嵌套的结构展平,还有没有别的办法? 感觉如果结构很大的话, 嵌套展平太不友好了
...全文
744 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AlexChenLei 2014-07-08
  • 打赏
  • 举报
回复
为什么我已经结贴给分了,帖子上两位的得分还是0?...
The_Third_Wave 2014-07-08
  • 打赏
  • 举报
回复
引用
早上过来按照你的例子试过,可以了, 昨天晚上的问题重现不出来... 晕
这是什么节奏。。。
AlexChenLei 2014-07-08
  • 打赏
  • 举报
回复
引用 1 楼 u013171165 的回复:
[quote=引用 楼主 lday 的回复:] 用struct.pack进行数据打包并发送至网络 对端是c写的服务器, 接受的数据结构是一个嵌套的数据结构 typedef struct HeadTag { unsgined short length; unsigned short dwId; } HeadT; typedef struct MsgTag { HeadT head; int content Id; char name[6]; } MsgT 对于这种嵌套的结构如何进行数据打包? 我原本想通过struct.pack打包head数据, 然后再将head数据打包到msg中, 但是好像没法用: Head = struct.pack('HH', 1, 2) msg = struct.pack('4si10s', Head, 19, "abcdef") 但是报错: struct.error: argument for 's' must be a string 想问问除了将嵌套的结构展平,还有没有别的办法? 感觉如果结构很大的话, 嵌套展平太不友好了
socket只能发string数据,数据包是不知道你的数据到底是什么类型的,所以你得用能正确恢复数据结构的string发你的数据。一般我使用JSON发数据,好检查,便于恢复。当然,我做的soket作品只是玩具。仅供参考。说错请纠正。[/quote] 谢谢你提供的思路。
AlexChenLei 2014-07-08
  • 打赏
  • 举报
回复
引用 2 楼 bugs2k 的回复:
import struct

def display(s):
    b = bytearray(s)
    for i in b:
        print "%02x" % i,
    print

Head = struct.pack('HH', 1, 2)
display(Head)
msg = struct.pack('4si10s', Head, 19, "abcdef")
display(msg)
早上过来按照你的例子试过,可以了, 昨天晚上的问题重现不出来... 晕 谢谢回复!
The_Third_Wave 2014-07-08
  • 打赏
  • 举报
回复
引用 2 楼 bugs2k 的回复:
import struct

def display(s):
    b = bytearray(s)
    for i in b:
        print "%02x" % i,
    print

Head = struct.pack('HH', 1, 2)
display(Head)
msg = struct.pack('4si10s', Head, 19, "abcdef")
display(msg)
了解了下struct,怎么感觉你什么都懂啊?看来有问题要先找你,以前我问了很多人,有没有办法发指定数据结构的数据,都说要自己写,so,只好用了JSON。顺便请教个问题,qt中linux和win QDateTimeEdit 显示的时间格式不一致,有没有办法让这两个时间显示格式统一?昨天换系统,出现了bug
bugs2k 2014-07-08
  • 打赏
  • 举报
回复
import struct

def display(s):
b = bytearray(s)
for i in b:
print "%02x" % i,
print

Head = struct.pack('HH', 1, 2)
display(Head)
msg = struct.pack('4si10s', Head, 19, "abcdef")
display(msg)


The_Third_Wave 2014-07-07
  • 打赏
  • 举报
回复
引用 楼主 lday 的回复:
用struct.pack进行数据打包并发送至网络 对端是c写的服务器, 接受的数据结构是一个嵌套的数据结构 typedef struct HeadTag { unsgined short length; unsigned short dwId; } HeadT; typedef struct MsgTag { HeadT head; int content Id; char name[6]; } MsgT 对于这种嵌套的结构如何进行数据打包? 我原本想通过struct.pack打包head数据, 然后再将head数据打包到msg中, 但是好像没法用: Head = struct.pack('HH', 1, 2) msg = struct.pack('4si10s', Head, 19, "abcdef") 但是报错: struct.error: argument for 's' must be a string 想问问除了将嵌套的结构展平,还有没有别的办法? 感觉如果结构很大的话, 嵌套展平太不友好了
socket只能发string数据,数据包是不知道你的数据到底是什么类型的,所以你得用能正确恢复数据结构的string发你的数据。一般我使用JSON发数据,好检查,便于恢复。当然,我做的soket作品只是玩具。仅供参考。说错请纠正。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧