4

私は C (サーバー/クライアント通信の実装) でプログラムを読んでいて、これを見ました:

for (i = 0; i < len; i++)
 sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);

この行は何をしますか? これは特にわかりません: nickmsg+i*2. nickmsgは char テーブルでiあり、整数です。だったらnickmsgわかりますが、この行の目的は何ですか?

ありがとう。

4

3 に答える 3

3

が指すアドレスから開始し、メモリ内にnickmsg追加のi * 2 * CHAR_BIT / 8バイトを移動します。そこから、バイトbuf[i] & 0xFFを占める、の16進表現を記述します。2 * CHAR_BIT / 8ごとに繰り返しますi

buf次のように見えると仮定します

buf[0] = 20
buf[1] = 12

次に、が指すメモリは次のnickmsgようになります。

nickmsg
|
|
|
+ + + + +
0 2 4 6 8
140C\

ここで、最後に書き込む \nullターミネータの私の命名法です。sprintf

于 2012-04-10T15:20:13.840 に答える
2

buf配列内の値を16進表現に変換し、配列に格納しますnickmsg

の各値をステップスルーするときに、バイナリである、を使用してビット単位でbuf実行することにより、右端の8ビットを抽出します。AND0xFF1111 1111

次に、フォーマット文字列"%02X"を使用して、各値を2桁の16進数として出力します。

16進数の各ペアをnickmsg配列に格納し、インデックスを使用してそれらを超えて進みますi*2

于 2012-04-10T15:18:54.823 に答える
1

nickmsg+i*2nickmsg変数をC文字列テーブルへのポインタとして扱い、ループごとに2つのエントリをステップスルーします。

于 2012-04-10T15:19:09.207 に答える