打印值数组的十六进制表示

时间:2012-04-10 15:17:26

标签: c arrays hex type-conversion printf

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

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

这条线做什么?我不明白这一点:nickmsg+i*2nickmsg是一个char表,i是一个整数。如果它只是nickmsg,那我就明白了,但这条线的目的是什么?

感谢。

3 个答案:

答案 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个条目。