【问题标题】:Printing char buffer in hex array以十六进制数组打印字符缓冲区
【发布时间】:2012-11-07 17:47:17
【问题描述】:

我正在将 512 个字符读入缓冲区并希望以十六进制显示它们。我尝试了以下方法,但它始终输出相同的值,尽管应该通过网络接收不同的值。

char buffer[512];
bzero(buffer, 512);
n = read(connection_fd,buffer,511);
if (n < 0) printf("ERROR reading from socket");
printf("Here is the message(%d): %x\n\n", sizeof(buffer), buffer);

有没有可能我在这里输出的是缓冲区数组的地址,而不是它的内容?在 C 中是否有一种简单的方法来完成这项任务,还是我需要编写自己的子例程?

【问题讨论】:

标签: c


【解决方案1】:

这将读取相同的 512 字节缓冲区,但在输出时将每个 字符 转换为十六进制:

char buffer[512];
bzero(buffer, 512);
n = read(connection_fd,buffer,511);
if (n < 0) printf("ERROR reading from socket");

printf("Here is the message:n\n");
for (int i = 0; i < n; i++)
{
    printf("%02X", buffer[i]);
}

【讨论】:

  • 您可能需要"%02X" 而不是"%X",否则单个数字值(即十进制 0-15 范围内的字节)将打印为单个数字。
  • 太好了,这行得通。感谢大家提供的所有 cmets,对回到基本的 C 内容非常有帮助:)。
  • 你想要(unsigned char)
【解决方案2】:

要以十六进制显示字符,您只需要正确的格式说明,并且需要遍历缓冲区:

//where n is bytes back from the read:
printf("Here is the message(size %d): ", n);
for(int i = 0; i<n; i++)
     printf("%x", buffer[i]);

您使用的代码正在打印缓冲区的地址,这就是它没有为您改变的原因。

您已经有一段时间了,如果您希望看到每个字节的格式都很好0xNN,您也可以使用%#x 格式:

for(int i = 0; i<n; i++)
    printf("%#x ", buffer[i]);

得到类似的东西:

0x10 0x4 0x44 0x52...

【讨论】:

  • 遗憾的是,%#x 仅在 0x 之前添加(如果不是 0)。
【解决方案3】:

这根本不是 C 的工作方式。如果有的话,您正在打印buffer 数组的地址。

您需要编写一个子例程,循环遍历缓冲区中的每个字节并将其打印为十六进制。

如果你真的希望人们帮助你,我建议你开始接受一些答案。

【讨论】:

  • 嗯,如果没有早上的那杯咖啡,千万不要继续这样做。
猜你喜欢
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2022-01-18
相关资源
最近更新 更多