为什么?关于inet_pton()

kanrayi 2011-12-16 12:19:08
为什么我用inet_pton()把ip地址转化的整数和mysql里面的函数INET_ATON算出来的整数不一样呢?
具体代码如下:

struct in_addr s;
if( inet_pton(AF_INET, ipStr, (void *)&s) <= 0)
{
LOG(1)("get ip error!");
return -1;
}
...全文
414 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hancker 2011-12-19
  • 打赏
  • 举报
回复
自己写个简单的大小端转换的函数,调用后。再比较
或者调用ntohl(大端转小端)
qq120848369 2011-12-16
  • 打赏
  • 举报
回复
这个涉及到大小端问题.

inet_pton保证将字串IP转化为网络字节序.

也就是1.2.3.4在内存里从低到高一定也是1 2 3 4, 但是在C语言里解释一个4字节的long型是与字节序有关的.

mysql可能是避免了字节序的影响, 按照一个字节序无关的计算方法得到long型, 而不是像C语言里实现里那样直接把4字节当做Long解析。

mysql极有可能是这样计算的: (((1*256)+2)*256+3)*256+4 得到了一个long.

mysql> select inet_aton("127.0.0.1");
+------------------------+
| inet_aton("127.0.0.1") |
+------------------------+
| 2130706433 |
+------------------------+
1 row in set (0.00 sec)


当然我不是胡说的,因为在inet_pton结束后,内存中从低到高是1 2 3 4 ,而机器一般都是小端, 所以当做long解析其实是这个整数: 0x4321 。

而在mysql里,因为采取了字节序无关的计算方法得到Long,所以一定是0x1234. 看看结果你也应该明白了。

127.0.0.1 按照字节序无关的计算方法结果是 : ((127*256+0)*256+0)*256+1 = 2130706433 , 还真就是那个值。
kanrayi 2011-12-16
  • 打赏
  • 举报
回复
我想要在程序里面做转换,就是说不用mysql的函数
kanrayi 2011-12-16
  • 打赏
  • 举报
回复
那怎么样才能使两者计算的值一样呢?

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧