gpt4 book ai didi

将大端结构转换为小端结构

转载 作者:太空狗 更新时间:2023-10-29 15:02:49 25 4
gpt4 key购买 nike

我正在编写一个 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的方法中哪一种是正确的

方法一

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);

方法二

除此之外都一样

printf("%d:%d", ntohs(msg2_m.a), ntohs(msg2_m.b));

方法 3

不转换“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 是正确的,但那只是我,我不确定字节顺序的内部结构。任何帮助将不胜感激。

谢谢,希瓦姆卡拉

最佳答案

首先,转换不影响字节顺序。

其次,您不希望在代码中处处考虑字节顺序,因为您或其他人忘记并在某处犯错误,以后再尝试查找 bug 会非常困难.因此,一旦读入数据,就将其转换为正确的字节顺序。如果您读取包含短裤数组的结构,请立即将整个短裤数组转换为正确的字节顺序。任何其他结构也是如此。转换数据并存储结果;不要每次需要阅读或打印内容时都使用 ntohs。将此代码与程序的其余部分隔离开,这样您就可以忘记程序其他部分的字节顺序,而只在处理转换代码时考虑字节顺序。

关于将大端结构转换为小端结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com