Shi*_*vam 5 c networking endianness
我正在制作一个与使用大端字节排序的患者监视器通信的C程序.例如,如果我确定C结构
typedef struct {
int short a;
int short b;
int c;
} msg;
Run Code Online (Sandbox Code Playgroud)
要阅读这种结构,我可以简单地使用ntohs(msg.a),ntohs(msg.b),ntohl(msg.c).但是一些结构具有短整数缓冲区,但缓冲区本身是另一种结构的类型.例如,
typedef struct {
int short length;
int short b[MAX_BUF_SIZE];
} msg1;
Run Code Online (Sandbox Code Playgroud)
上述结构中的字段"b"表示另一种结构,如下所示:
typedef struct {
int short a;
int short b;
} msg2;
Run Code Online (Sandbox Code Playgroud)
现在,我的问题是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);
Run Code Online (Sandbox Code Playgroud)
所有相同的除外
printf("%d:%d", ntohs(msg2_m.a), ntohs(msg2_m.b));
Run Code Online (Sandbox Code Playgroud)
不转换"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));
Run Code Online (Sandbox Code Playgroud)
我需要了解何时将结构转换为某些其他结构时,它的字节顺序是否会在通过网络时根据新结构进行更改?我认为APPROACH 3是正确的,但那只是我,我不确定字节排序的内部.任何帮助,将不胜感激.
谢谢Shivam Kalra
首先,转换不会影响字节顺序。
其次,您不想在代码中的任何地方都考虑字节顺序,因为您或其他人会忘记并在某个地方犯下错误,而以后试图找到错误将是地狱。因此,一旦读入数据,就将其转换为正确的字节顺序。如果您读取包含 Shorts 数组的结构,请立即将整个 Shorts 数组转换为正确的字节顺序。对于任何其他结构也是如此。转换数据并存储结果;不要在每次需要阅读或打印某些内容时都使用 ntohs。将此代码与程序的其余部分分开,以便您可以忘记程序其他部分中的字节顺序,而仅在处理转换代码时考虑字节顺序。
| 归档时间: |
|
| 查看次数: |
5268 次 |
| 最近记录: |