我从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变成无符号整数?
答案 0 :(得分:3)
请注意780b
是0b78
的字节交换,它是您传入的数字的低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
闻所未闻的时间。)