如何使用htonl将little endian转换为big endian

我有以下元素的结构。 此外,结构是完美填充。

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函数。 但是,它不起作用,任何人都可以建议我一个很好的答案。

Endian-ness仅适用于单个字段,而不适用于struct字段的顺序。 在您列出的字段中,只有定义为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); 

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

顺便说一句,我不知道你是否在变量ad(struct)上使用ntohl,只是告诉你应该逐个转换结构的每个元素而不是用ntohl / ntohs转换整个struct变量/ htonl / htons。