私は C (サーバー/クライアント通信の実装) でプログラムを読んでいて、これを見ました:
for (i = 0; i < len; i++)
sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);
この行は何をしますか? これは特にわかりません: nickmsg+i*2.
nickmsgは char テーブルでiあり、整数です。だったらnickmsgわかりますが、この行の目的は何ですか?
ありがとう。
私は C (サーバー/クライアント通信の実装) でプログラムを読んでいて、これを見ました:
for (i = 0; i < len; i++)
sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);
この行は何をしますか? これは特にわかりません: nickmsg+i*2.
nickmsgは char テーブルでiあり、整数です。だったらnickmsgわかりますが、この行の目的は何ですか?
ありがとう。
が指すアドレスから開始し、メモリ内に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
buf配列内の値を16進表現に変換し、配列に格納しますnickmsg。
の各値をステップスルーするときに、バイナリである、を使用してビット単位でbuf実行することにより、右端の8ビットを抽出します。AND0xFF1111 1111
次に、フォーマット文字列"%02X"を使用して、各値を2桁の16進数として出力します。
16進数の各ペアをnickmsg配列に格納し、インデックスを使用してそれらを超えて進みますi*2。
nickmsg+i*2nickmsg変数をC文字列テーブルへのポインタとして扱い、ループごとに2つのエントリをステップスルーします。