我正在阅读 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,它通过执行按位ANDwith提取最右边的 8 位0xFF,这是二进制的1111 1111。
然后它使用格式字符串"%02X"将每个值打印为 2 个十六进制数字。
它将每对十六进制数字存储在nickmsg数组中,然后通过使用索引前进过去i*2。
nickmsg+i*2将 nickmsg 变量视为指向 C 字符串表的指针,然后在每个循环中单步执行 2 个条目。