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