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

时间:2022-07-24 18:16:43
用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

想问问除了将嵌套的结构展平,还有没有别的办法? 感觉如果结构很大的话, 嵌套展平太不友好了

7 个解决方案

#1


引用 楼主 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作品只是玩具。仅供参考。说错请纠正。

#2


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)

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

#3


引用 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)

关于python struct.pack打包嵌套结构数据的问题
关于python struct.pack打包嵌套结构数据的问题
了解了下struct,怎么感觉你什么都懂啊?看来有问题要先找你,以前我问了很多人,有没有办法发指定数据结构的数据,都说要自己写,so,只好用了JSON。顺便请教个问题,qt中linux和win QDateTimeEdit 显示的时间格式不一致,有没有办法让这两个时间显示格式统一?昨天换系统,出现了bug

#4


引用 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)

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


早上过来按照你的例子试过,可以了, 昨天晚上的问题重现不出来... 晕
谢谢回复!

#5


引用 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作品只是玩具。仅供参考。说错请纠正。


谢谢你提供的思路。

#6


引用
早上过来按照你的例子试过,可以了, 昨天晚上的问题重现不出来... 晕
这是什么节奏。。。

#7


为什么我已经结贴给分了,帖子上两位的得分还是0?...

#1


引用 楼主 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作品只是玩具。仅供参考。说错请纠正。

#2


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)

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

#3


引用 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)

关于python struct.pack打包嵌套结构数据的问题
关于python struct.pack打包嵌套结构数据的问题
了解了下struct,怎么感觉你什么都懂啊?看来有问题要先找你,以前我问了很多人,有没有办法发指定数据结构的数据,都说要自己写,so,只好用了JSON。顺便请教个问题,qt中linux和win QDateTimeEdit 显示的时间格式不一致,有没有办法让这两个时间显示格式统一?昨天换系统,出现了bug

#4


引用 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)

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


早上过来按照你的例子试过,可以了, 昨天晚上的问题重现不出来... 晕
谢谢回复!

#5


引用 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作品只是玩具。仅供参考。说错请纠正。


谢谢你提供的思路。

#6


引用
早上过来按照你的例子试过,可以了, 昨天晚上的问题重现不出来... 晕
这是什么节奏。。。

#7


为什么我已经结贴给分了,帖子上两位的得分还是0?...