1
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*)吗?

4

2 回答 2

4

ntohl意思是“网络主机长”。它(大概)将整数类型从网络(大端)转换为主机字节顺序。但是,如果您不熟悉机器的字节序,则在使用此方法时要小心。如果您有一台小端机器并使用ntohl已经采用小端格式的数据(即未以大端或其他方式发送),您可能会遇到问题。

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

编辑

正如 njr 在下面的评论中指出的那样,这是一个很好的字节序参考:http ://en.wikipedia.org/wiki/Endianness

于 2013-01-05T15:52:58.603 回答
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 *根据文档返回 a 。(uint32_t *)会将其char *转换为指向无符号 32 位整数的指针,*之前将取消引用 this 以获取实际值(无符号的 32 位整数),最后ntohl将其转换为平台的本机 32 位整数,这可能意味着原始存储格式为网络顺序。

如果我们要“拆分”该代码,那将给出:

// Get value from database as a char *
char *in_database = PQgetvalue(result, i, 0);
// Convert the pointer to char to a pointer to an unsigned, 32bit integer
uint32_t *ptr = (uint32_t *) in_database;
// Dereference that pointer to obtain the actually stored value
uint32_t stored_value = *ptr;
// Turn that value to a native integer for the CPU
uint32_t ip = ntohl(stored_value);
于 2013-01-05T15:56:12.243 回答