我正在阅读 C 中的程序(服务器/客户端通信的实现),我看到了这个:
for (i = 0; i < len; i++)
sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);
这条线有什么作用?我特别不明白这一点:nickmsg+i*2
。
nickmsg
是一个字符表并且i
是一个整数。如果只是nickmsg
,好的,我会理解,但是这条线的目的是什么?
谢谢。
我正在阅读 C 中的程序(服务器/客户端通信的实现),我看到了这个:
for (i = 0; i < len; i++)
sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);
这条线有什么作用?我特别不明白这一点:nickmsg+i*2
。
nickmsg
是一个字符表并且i
是一个整数。如果只是nickmsg
,好的,我会理解,但是这条线的目的是什么?
谢谢。
从指向的地址开始,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
它将数组中的值转换为buf
十六进制表示并将它们存储在nickmsg
数组中。
当它逐步遍历 中的每个值时buf
,它通过执行按位AND
with提取最右边的 8 位0xFF
,这是二进制的1111 1111
。
然后它使用格式字符串"%02X"
将每个值打印为 2 个十六进制数字。
它将每对十六进制数字存储在nickmsg
数组中,然后通过使用索引前进过去i*2
。
nickmsg+i*2
将 nickmsg 变量视为指向 C 字符串表的指针,然后在每个循环中单步执行 2 个条目。