我正在制作一个与使用大端字节序的患者监视器通信的C程序。例如,如果我有特定的C结构体
typedef struct {
int short a;
int short b;
int c;
} msg;
要读取这种结构,我可以简单地使用ntohs(msg.a)、ntohs(msg.b)、ntohl(msg.c)。但有些结构具有一个短整型的缓冲区,但该缓冲区本身是另一种结构的类型。例如:
typedef struct {
int short length;
int short b[MAX_BUF_SIZE];
} msg1;
上述结构中的字段“b”表示另一个结构,如下所示:
typedef struct {
int short a;
int short b;
} msg2;
现在,我的问题是1)我应该将结构体“msg1”的所有短整型转换为主机顺序,然后将其强制转换为类型“msg2”的指针,并简单地读取“msg2.a”和“msg2.b”,还是2)我也应该转换“msg2.a”和“msg2.b”的字节顺序,或者3)只需将“msg1.b”强制转换为类型“msg2”的指针,并通过将每个值转换为主机顺序来读取“msg2.a”和“msg2.b”?
请告诉我正确的读取msg1的方法。
方法1
int t[msg1.length];
for(int i = 0; i < msg1.length; i++)
t[i] = ntohs(*(msg1.b + i));
msg2 * msg2_m = (msg2 *)t;
/* should I convert the msg2_m.a and msg2_m.b as well? */
printf("%d:%d", msg2_m.a, msg2_m.b);
方法2
与之前的方法相同,唯一不同之处在于:
printf("%d:%d", ntohs(msg2_m.a), ntohs(msg2_m.b));
方法三
不将 "msg1.b" 转换,直接将 "msg1.b" 强制转换为 "msg2",只将 "msg2.a" 和 "msg2.b" 转换为主机字节顺序。
msg2 *msg2_m = (msg2 *)msg1.a;
printf("%d:%d", ntohs(msg2_m.a), ntohs(msg2_m.b));
我需要了解当一个结构体被转换成其他结构体时,它的字节顺序是否会根据新结构体在网络上传输而改变?我认为“方法3”是正确的,但这只是我的个人看法,我不确定字节顺序的内部情况。任何帮助将不胜感激。
谢谢, Shivam Kalra