【问题标题】:converting ASCII char array to hex char array将 ASCII 字符数组转换为十六进制字符数组
【发布时间】:2022-01-09 03:54:12
【问题描述】:

我正在尝试将 ASCII 字符数组转换为十六进制字符数组以执行以下操作:

输入:char string[5]="abcd1234567"

输出:char buf[4096] = {0x63, 0x61, 0x62, 0x63, 0x64, 0x31, 0x32, 0x33 0x34, 0x35, 0x36, 0x37};

但我的代码不起作用,我无法弄清楚。

代码:

char string[20]="abcd";
   char buff[4000];
   

    sprintf(buff[0],"%02x",string[0]);

    printf("string[0]: %c",string[0]); 

它给出了这个错误:

warning: passing argument 1 of 'sprintf' makes pointer from integer without a cast [-Wint-conversion]
   16 |     sprintf(buff[0],"%02x",string[0]);

【问题讨论】:

  • 提示:它已经是那种格式了。
  • 这似乎只是警告而不是错误
  • sprintf 的第一个参数必须是 buff 而不是 buff[0]....
  • string[5] 太短了
  • 您在第一个示例中的输出是错误的。输出显示 'c' 作为字符串中的第一项 (0x63)。

标签: arrays c


【解决方案1】:

(char)'a'(char)0x61 在基于 ASCII 的机器上没有区别,所以您只需要以下内容:

char buf[4096];
memset(buf, 0, sizeof(buf));
strncpy(buf, string, sizeof(buf));

memset 将尾随元素设置为0,就像char buf[4096] = { ... }; 一样。如果您不关心尾随元素,则可以摆脱它。

strncpy 执行以下操作:

buf[ 0] = string[ 0];  // 'a'  0x61
buf[ 1] = string[ 1];  // 'b'  0x62
...
buf[11] = string[11];  // '7'  0x37
buf[12] = string[12];  // '\0' 0x00

注意被复制的尾随 NUL。但考虑到buf 中的额外空间,这无关紧要。如果您想避免额外的 NUL,请使用 memcpy 而不是 strncpy

【讨论】:

  • 我假设 OP 想要输出一个完整的数组定义作为文本(粘贴到另一个程序中)。
  • 你也认为charstring[5]="abcd1234567"是要解析的C代码吗?
  • 不,我认为“输出:char buf[4096] = {0x63, 0x61, 0x62, 0x63, 0x64, 0x31, 0x32, 0x33 0x34, 0x35, 0x36, 0x37};”是。
  • @Weather Vane,我发现输入和输出使用两种不同的符号的可能性较小,而且 OP 更可能不知道它们已经是相同的字节。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2015-01-23
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多