【问题标题】:Convert Char * buffer to hex for printing in c [closed]将 Char * 缓冲区转换为十六进制以在 c 中打印 [关闭]
【发布时间】:2013-10-24 21:37:06
【问题描述】:

您好,我尝试将 char 缓冲区中的值作为十六进制值打印为 ("0X%x"),

char buffer[1024]
printf("recived (0x%x) from the client\n",buffer);

但是当我编译代码时有警告:

server.c:105:5: warning: format ‘%x’ expects argument of type ‘unsigned int’, but argument 2 has type ‘char *’ [-Wformat]

那么如何解决这个问题????

【问题讨论】:

  • 你想在什么意义上“转换”它?将每个字节打印为十六进制?您将需要一个循环。 (在你开始编程之前学习基本的算法和数据结构会很好。这是非常基础的东西,如果你不能自己解决它,那么你可能还不应该编写一个成熟的客户端-服务器应用程序。)
  • 你能提供一些缓冲区内容的例子和预期的输出吗?

标签: c unix hex printf


【解决方案1】:

我会这样做:

#include <stdio.h>
int main(void) {
  unsigned char buffer[1024];
  int ii;
  // put some dummy values in the buffer:
  for(ii=0; ii<1024; ii++) buffer[ii] = ii%256;

  // printf("0x"); -- uncomment if you want to start with "0x"

  for(ii = 0; ii < 1024; ii++) {
    printf("%02x", (unsigned int)(buffer[ii]));
    if(ii%4 == 3) printf(" ");    // groups of 8: makes more readable
                                  // uncomment if you want "all one line"
    if(ii%32 == 31) printf("\n"); // ditto
  }

  printf("\n");
}

请注意,这不会在输出前加上0x - 因为它是一个很大的长数字,这样做似乎很愚蠢。但是您可以在开头添加它。相反,我选择添加一些格式(空格、回车)以使输出更易于阅读:

00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c3d3e3f
40414243 44454647 48494a4b 4c4d4e4f 50515253 54555657 58595a5b 5c5d5e5f
60616263 64656667 68696a6b 6c6d6e6f 70717273 74757677 78797a7b 7c7d7e7f
80818283 84858687 88898a8b 8c8d8e8f 90919293 94959697 98999a9b 9c9d9e9f
a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf
c0c1c2c3 c4c5c6c7 c8c9cacb cccdcecf d0d1d2d3 d4d5d6d7 d8d9dadb dcdddedf
e0e1e2e3 e4e5e6e7 e8e9eaeb ecedeeef f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff
00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c3d3e3f
40414243 44454647 48494a4b 4c4d4e4f 50515253 54555657 58595a5b 5c5d5e5f
60616263 64656667 68696a6b 6c6d6e6f 70717273 74757677 78797a7b 7c7d7e7f
80818283 84858687 88898a8b 8c8d8e8f 90919293 94959697 98999a9b 9c9d9e9f
a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf
c0c1c2c3 c4c5c6c7 c8c9cacb cccdcecf d0d1d2d3 d4d5d6d7 d8d9dadb dcdddedf
e0e1e2e3 e4e5e6e7 e8e9eaeb ecedeeef f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff
00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c3d3e3f
40414243 44454647 48494a4b 4c4d4e4f 50515253 54555657 58595a5b 5c5d5e5f
60616263 64656667 68696a6b 6c6d6e6f 70717273 74757677 78797a7b 7c7d7e7f
80818283 84858687 88898a8b 8c8d8e8f 90919293 94959697 98999a9b 9c9d9e9f
a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf
c0c1c2c3 c4c5c6c7 c8c9cacb cccdcecf d0d1d2d3 d4d5d6d7 d8d9dadb dcdddedf
e0e1e2e3 e4e5e6e7 e8e9eaeb ecedeeef f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff
00010203 04050607 08090a0b 0c0d0e0f 10111213 14151617 18191a1b 1c1d1e1f
20212223 24252627 28292a2b 2c2d2e2f 30313233 34353637 38393a3b 3c3d3e3f
40414243 44454647 48494a4b 4c4d4e4f 50515253 54555657 58595a5b 5c5d5e5f
60616263 64656667 68696a6b 6c6d6e6f 70717273 74757677 78797a7b 7c7d7e7f
80818283 84858687 88898a8b 8c8d8e8f 90919293 94959697 98999a9b 9c9d9e9f
a0a1a2a3 a4a5a6a7 a8a9aaab acadaeaf b0b1b2b3 b4b5b6b7 b8b9babb bcbdbebf
c0c1c2c3 c4c5c6c7 c8c9cacb cccdcecf d0d1d2d3 d4d5d6d7 d8d9dadb dcdddedf
e0e1e2e3 e4e5e6e7 e8e9eaeb ecedeeef f0f1f2f3 f4f5f6f7 f8f9fafb fcfdfeff

还要注意,我使用unsigned char 缓冲区 - 否则,大于127 的数字将被解释为负数,例如,128,而不是打印为80,将打印为FFFFFF80 - 换句话说,格式说明符将被忽略。

您可以将buffer 保留为char,并将printf 更改为

printf("%02x", (unsigned int)(unsigned char)buffer[ii]);

但它确实变得相当笨拙......

【讨论】:

    【解决方案2】:

    打印缓冲区中的第一个字符:

    printf("0x%02x", ((unsigned char) buffer[0]));
    

    打印整个缓冲区 - 循环中的相同内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2015-02-14
      • 2016-12-22
      • 2016-03-14
      • 2019-11-26
      • 2019-09-04
      相关资源
      最近更新 更多