4

我正在阅读 C 中的程序(服务器/客户端通信的实现),我看到了这个:

for (i = 0; i < len; i++)
 sprintf(nickmsg+i*2, "%02X", buf[i] & 0xFF);

这条线有什么作用?我特别不明白这一点:nickmsg+i*2nickmsg是一个字符表并且i是一个整数。如果只是nickmsg,好的,我会理解,但是这条线的目的是什么?

谢谢。

4

3 回答 3

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

于 2012-04-10T15:20:13.840 回答
2

它将数组中的值转换为buf十六进制表示并将它们存储在nickmsg数组中。

当它逐步遍历 中的每个值时buf,它通过执行按位ANDwith提取最右边的 8 位0xFF,这是二进制的1111 1111

然后它使用格式字符串"%02X"将每个值打印为 2 个十六进制数字。

它将每对十六进制数字存储在nickmsg数组中,然后通过使用索引前进过去i*2

于 2012-04-10T15:18:54.823 回答
1

nickmsg+i*2将 nickmsg 变量视为指向 C 字符串表的指针,然后在每个循环中单步执行 2 个条目。

于 2012-04-10T15:19:09.207 回答