我正在阅读C中的程序(服务器/客户端通信的实现),我看到了这一点:
for (i = 0; i < len; i++)
sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);
这条线做什么?我不明白这一点:nickmsg+i*2
。
nickmsg
是一个char表,i
是一个整数。如果它只是nickmsg
,那我就明白了,但这条线的目的是什么?
感谢。
答案 0 :(得分:3)
从nickmsg
指向的地址开始,然后在内存中再追加i * 2 * CHAR_BIT / 8
个字节。从那里,写出buf[i] & 0xFF
的十六进制表示,它将占用2 * CHAR_BIT / 8
个字节。对每个i
重复一次。
假设buf
看起来像
buf[0] = 20
buf[1] = 12
然后nickmsg
指向的内存将如下所示:
nickmsg
|
|
|
+ + + + +
0 2 4 6 8
140C\
\
是我sprintf
在末尾写入的空终止符的命名法。
答案 1 :(得分:2)
它将buf
数组中的值转换为十六进制表示形式,并将它们存储在nickmsg
数组中。
当它逐步执行buf
中的每个值时,它会通过执行AND
0xFF
来提取最右边的8位,1111 1111
是二进制"%02X"
。
然后它使用格式字符串nickmsg
将每个值打印为2个十六进制数字。
它将每对十六进制数字存储在i*2
数组中,然后使用索引{{1}}推进它们。
答案 2 :(得分:1)
nickmsg+i*2
将nickmsg变量视为指向C字符串表的指针,然后在每个循环中单步执行2个条目。