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 を返します。これを符号なし32 ビット整数へのポインタに変換し、その前にこれを逆参照し(uint32_t *)て実際の値 (符号なしの 32 ビット整数) を取得し、最後にそれをプラットフォームのネイティブ 32 ビット整数に変換します。これはおそらく次のことを意味します。元の保存形式はネットワーク順です。char **ntohl

そのコードを「分割」すると、次のようになります。

// 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 に答える