ntohl(*(uint32_t *)...)做什么?

时间:2013-01-05 15:51:05

标签: c++ pointers type-conversion

ip=ntohl(*(uint32_t*)PQgetvalue(result, i, 0));

此代码段的含义是什么?

我的猜测是这段代码从PostgreSQL数据库(其类型为uint32_t)获取输入并将其转换为IP格式(例如192.168.x.x

我的猜测是否正确?如果不是,那是什么意思?

注意:根据http://linux.die.net/man/3/ntohl

  

ntohl()函数将无符号整数netlong从网络字节顺序转换为主机字节顺序。

另外,有人可以解释*(uint32_t*)的作用吗?

2 个答案:

答案 0 :(得分:4)

ntohl表示“网络长期托管”。它(可能)将整数类型从网络(大端)转换为主机字节排序。但是,如果您不熟悉机器的字节顺序,请谨慎使用此方法。如果你有一个小端机器,并且对已经是小端格式的数据使用ntohl(即没有用big-endian或其他方式发送),你可能会遇到问题。

*(unit32_t*)是对32位无符号整数指针((unit32_t*)部分)的强制转换,然后前面的*是该指针上的解除引用运算符。

修改

以下是njr:http://en.wikipedia.org/wiki/Endianness

的评论中指出的对于endianess的良好参考

答案 1 :(得分:3)

根据文件:

For most queries, the value returned by PQgetvalue is a null-terminated ASCII
string representation of the attribute value. But if PQbinaryTuples() is TRUE,
the value returned by PQgetvalue is the binary representation of the type 
in the internal format of the backend server

我猜PQbinaryTuples在那里是真的。

PQGetvalue()根据文档返回char *(uint32_t *)会将char *转换为指向未定义的32位整数的指针,之前的*将取消引用它以获取实际值(无符号,32位整数),最后{ {1}}会将其转换为平台的本机32位整数,这可能意味着原始存储格式是网络顺序。

如果我们要“拆分”那段代码,那就会给出:

ntohl