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

时间:2012-11-30 00:53:10

标签: c struct byte endianness

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

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

2 个答案:

答案 0 :(得分:3)

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

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

uint16_t netShort = htons(uint16_t hostShort);

或者您的示例struct:

struct.a = htons(struct.a);
struct.b = htons(struct.b); 

答案 1 :(得分:0)

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

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