2012-11-30 34 views
0

我有以下元素的struct。另外结构填补了填充。我如何使用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,我的意思是当我在我的big endian机器上打印此结构时,我得到以下

。 我得到

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

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

我正在使用htonl函数,如下所示。但是,它不工作,任何人都可以给我一个很好的答案。

+0

你如何打印它,什么是“像以下”?标准规定了'struct'成员放置在内存中的顺序,不要指望任何编译器因为字节顺序而违反。 –

+0

我不明白如何endenianess可能会导致元素交换。还有其他的错误。显示你的代码。 –

+0

这不是一个endian问题。如果LE计算机上的'uint16_t'值为'1',则在BE机器上变为'256'(或者如果您愿意,则为0x0100),则会发生endian问题。你所看到的是与你“发送”的内容不匹配的数据。 Endian差别不会交换结构元素(除非你正在调用'*((uint32_t *)&s)= htonl(*(uint32_t *)&s)'这样的愚蠢行为,其中's'是一个像上面那样的结构。然后所有投注都关闭)。 – WhozCraig

回答

3

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

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

uint16_t netShort = htons(uint16_t hostShort); 

或者您例如结构:

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

对于前两个元素a和b,它们是uint16_t,所以你应该使用htons/ntohs和将它们转换。其余三个元素c,d和e,它们是uint8_t,你不需要转换它们。顺便说一句,我不知道你是否在变量ad(struct)上使用ntohl,只是向你说明你应该逐个转换一个结构体的每个元素,而不是转换整个结构体变量与ntohl/ntohs/htonl/htons。