使用ntohs的unsigned int

时间:2014-05-15 17:38:34

标签: c dns protocols endianness

我从DNS服务器获取一些数据,我试图将某个部分转换为unsigned int(表示刷新间隔,到期等)。通过转换,我的意思是从大端到小端。问题是ntohs只放置2个字节的数据而不是4个。

memcpy(&number, data, 4);
printf("%x ",number);
number = ntohs(number);
printf("%x ",number);

Output:
b6fc0b78 780b

关于类型:

:t data
char*
:t number
unsigned int

奇怪的是,即使尝试使用位移来重建数字,值也会大不相同:例如0。

我怎样才能将b6fc0b78中的780bfcb6变成无符号整数?

1 个答案:

答案 0 :(得分:3)

请注意780b0b78的字节交换,它是您传入的数字的低16位。

s中的ntohs适用于short。它以uint16_t数量运行。 ntohs的参数和返回类型仅为unsigned int,因为它早于C89原型;在K& R C中,不可能表达函数的参数短于int。 (最新的POSIX规范seems to have decided that this historical wart is no longer necessary。我可以说服GCC和clang警告这个错误,但只能使用-Wconversion-Wall没有打开},-Wextra,还有-pedantic。)

您正在寻找的功能是ntohl。它以uint32_t数量运行,这是您想要的。 (l适用于long,但它的日期是64位long闻所未闻的时间。)