【问题标题】:Printing the hex representation of an array of values打印值数组的十六进制表示
【发布时间】:2012-04-22 21:43:47
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 为什么downvotes/votes确实关闭了?这是一个非常合理的初学者问题,也是 C 中典型习语的一个很好的例子。
  • @AdamLiss 可能是因为任何人在搜索他们的问题时遇到这个问题的机会为零。
  • @AndrewFinnell:更改标题和标签使问题更容易找到,而且不比投票更费力。
  • 关闭是因为“过于本地化”。我不知道为什么。十六进制表示在任何地方都是一样的,确定吗?
  • @AdamLiss 确实,我确信它是。我没有投反对票,只是回答了 cmets 提出的问题。但我会说,通过改变标题,它已经完全改变了原来的问题。标题回答了最初提出的问题。这个问题现在很有用,但是问题已经改变了。

标签: c arrays hex type-conversion printf


【解决方案1】:

从nickmsg 指向的地址开始,然后在内存中增加一个i * 2 * CHAR_BIT / 8 字节。从那里,写入buf[i] &amp; 0xFF 的十六进制表示,它将占用2 * CHAR_BIT / 8 字节。对每个 i 重复此操作。

假设buf 看起来像

buf[0] = 20
buf[1] = 12

那么nickmsg指向的内存会是这样的:

nickmsg
|
|
|
+ + + + +
0 2 4 6 8
140C\

\ 是我对 sprintf 最后写入的空终止符的命名法。

【讨论】:

  • 作为一个视觉示例,假设您有包含03|FE|B4 的buf,之后您将有包含00|03|00|FE|00|B4 的nickmsg
  • sizeof(char) == 1 被写入 C 标准,所以你可以假设它:)
  • 另一方面,如果buf 是一个字符表,为什么&amp; 0xFF 呢?
  • @Eregrith 不,nickmsg 将包含03F3B4,后跟一个空字符。
  • 是的,抱歉,我的思想在十六进制/字符上颠倒了。 %02X 确保 0x03 将写入 "03" 作为字符,而不是 0x00 0x03 作为十六进制 XD。呵呵。
【解决方案2】:

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

当它逐步遍历buf 中的每个值时,它通过按位执行AND 和0xFF(二进制1111 1111)来提取最右边的8 位。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多