0

我有以下元素的结构。加上结构完全填充。

typedef struct {
    uint16_t a;
    uint16_t b;
    uint8_t c;
    uint8_t d;
    uint8_t e[6];
} ad;

这种结构有点小端。我的意思是当我在我的大端机器上打印这个结构时,我得到以下信息

如果 c=1,d=2,e[0] =3,e[1]=4。我明白了

c=4,d=3,e[0] = 2 和 e[1]=1。

a 和 b 交换。此外,e[1] 与 c 交换,e[0] 与 d 交换。

我正在使用htonl如下功能。但是,它不起作用,任何人都可以建议我一个好的答案。

4

2 回答 2

3

Endian-ness 仅适用于单个字段,而不适用于结构字段的顺序。在您列出的字段中,只有定义为 uint16_t 的多字节整数字段受字节顺序控制,而 uint8_t 是单字节,因此无需考虑排序问题。无论字节序如何,单字节值的数组也将保持相同的长度。

要转换 uint16_t,您需要使用 htons() 函数而不是 htonl()。htonl() 函数需要一个 long,通常至少为 4 个字节。

uint16_t netShort = htons(uint16_t hostShort);

或者对于您的示例结构:

struct.a = htons(struct.a);
struct.b = htons(struct.b); 
于 2012-11-30T01:04:32.283 回答
0

对于前两个元素a和b,它们是uint16_t,所以你应该使用htons/ntohs来转换它们。其余三个元素 c、d 和 e,它们是 uint8_t,你不需要转换它们。

顺便说一句,我不知道你是否在变量 ad (struct) 上使用了 ntohl,只是向你澄清一下,你应该将 struct 的每个元素一个一个转换,而不是用 ntohl/ntohs 转换整个 struct 变量/htonl/htons.

于 2012-11-30T01:09:13.160 回答