正如标题所述,我从其中返回的数据gethostbyname
似乎有一个损坏的第一位。
这是一个简短的例子:
struct hostent* host= gethostbyname("indiana.cs.rit.edu");
if (!host)
exit(-1);
printf("%d.%d.%d.%d\n", (host->h_addr_list[0][0]),
(host->h_addr_list[0][1]),
(host->h_addr_list[0][2]),
(host->h_addr_list[0][3]));
printf("%d.%d.%d.%d\n",UP(host->h_addr_list[0][0]),
UP(host->h_addr_list[0][1]),
UP(host->h_addr_list[0][2]),
UP(host->h_addr_list[0][3]));
其中 UP 定义为
#define UP(X) (((int)X) & 0XFF)
上述代码的输出是:
-127.21.37.10
和129.21.37.10
。
现在我知道我应该使用inet_ntoa
来获取我的 char* 版本的 IP 地址。但是,有谁知道为什么我的第一个字节被破坏了?因为我从host->h_addr_list
我的第一个地址取回了一个 char**,[]
所以应该尊重第一个地址,而第二个地址[]
应该取消引用实际的 char。鉴于 char 是 1byte,为什么我必须执行按位运算符来清除损坏的位?
更令人困惑的是我得到 -127 或 129 的原因。
例如,在二进制中,一个字节的 129 应该看起来像..
1000 0001
但是,基于 -127 的值,它表明我的基础二进制值是。
1111 1111
现在,我真正感到困惑的是0XFF(1111 1111)的按位运算符如何返回129,因为我看到它应该返回255(无符号)或-127(有符号)。额外的数据来自哪里?
我在这里先向您的帮助表示感谢。