私は 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ビットを抽出します。AND
0xFF
1111 1111
次に、フォーマット文字列"%02X"
を使用して、各値を2桁の16進数として出力します。
16進数の各ペアをnickmsg
配列に格納し、インデックスを使用してそれらを超えて進みますi*2
。
nickmsg+i*2
nickmsg変数をC文字列テーブルへのポインタとして扱い、ループごとに2つのエントリをステップスルーします。