【问题标题】:How to save hexadecimal ASCII values to array (buffer) in C?如何将十六进制 ASCII 值保存到 C 中的数组(缓冲区)中?
【发布时间】:2019-03-27 01:25:06
【问题描述】:

我在输入中有一个 int 值,我想将它作为 ASCII 的十六进制表示形式保存到缓冲区/数组中。 我知道如何以十六进制形式打印它,但我怎样才能将它这样保存到缓冲区?

这是我写的代码:

int a = 98765;
char buffer[20];
m = sprintf(buffer, "%d", a);

printf("ASCII value in hex: ");
for(int i=0; buffer[i]!='\0'; i++)
{
    printf("%02X", buffer[i]);
}

例如如果 a=123 我想得到 313233

【问题讨论】:

  • 为什么首先用十进制sprintf它?为什么不直接使用 sprintf(buffer, "%02X".a)?
  • @LeeDanielCrocker 谢谢!我忘了补充说我想获得十六进制的 ASCII 值,而不是整数,所以例如对于 a=123456 我想获得 313233343536
  • 我很困惑。从您的示例中,您的代码看起来应该按原样工作。那么,对于123,如果你没有得到313233 的输出,那么你得到的是什么?我刚刚下载并测试了你的代码,它可以工作,所以 double 很困惑 :-)
  • 我只是重读了你的问题,所以如果你想 save 你的printf 打印到缓冲区中,你需要一个 second 缓冲区(例如char hexbuffer[50])。现在,将您的 printf 替换为:sprintf(&hexbuffer[i * 2],"%02X",buffer[i])。您不能在单个缓冲区中执行此操作,因为您输出的字符数是原来的两倍
  • 好奇为什么char buffer[20];中有20个?注意:如果a 是 64 位,sprintf(buffer, "%d", a); 可能需要 21。

标签: c type-conversion hex buffer ascii


【解决方案1】:

第一个sprintf 为您提供了一个字符数组,其中每个字符的范围为 0x30 到 0x39。您希望将它们扩展为两个字符“3”和“0”、“3”和“1”等。

您将源中的每个字符扩展为输出中的两个字符,这意味着您不能使用与源缓冲区相同的目标缓冲区——您将在处理源缓冲区之前覆盖源缓冲区中的值。如果您需要buffer 中的结果,您可能希望将第一个sprintf 放入一个单独的char 数组中。在您的循环中,将printf 更改为sprintfbuffer 中的索引,每个循环将索引增加两个。 (通过两个,因为这样您将用第二次迭代的 sprintf 输出覆盖第一次迭代的字符串终止符,其中将包括一个新的字符串终止符。循环最后一次迭代中的 sprintf 将为您终止字符串.)

你没有提到你应该处理的最长输入,或者你为什么选择你所做的数组长度。如果您接受的输入对于您的缓冲区来说太长(并且不要忘记在最后一个字符之后为空终止考虑空间),那么这里存在缓冲区溢出的危险。

【讨论】:

  • 由于sprintf,他已经有了每个字符的二进制值,这只是他已经做过的另一种方法。它没有回答关于将文本存储在数组中而不是打印它的问题。
  • 我会重写的。他们重写了问题。
  • 啊 - 是的,对问题的改变是一个重要的澄清。我可以看到你可能会这样回答。但是,编辑比您的答案早(尽管有几分钟)。所有都可以在 SO 中编辑;这既是一个好处也是一个诅咒,因为它可以使现有的答案无效。
  • Clifford:我在您的回复之前重写了我的评论,因为我认为这是不合理的。我为做出毫无根据的指责和跑题表示歉意。我还根据您的批评重写了答案。
  • 最好指出缓冲区溢出的危险,但如果int 是32 位,那么它不能超过十位,因此十六进制扩展将限制为20 个字符.在这种情况下,用户输入不会导致缓冲区溢出 - 缓冲区只需要足够大但具有确定性。
【解决方案2】:

您已经使用sprintf 将十进制值表示为字符串;您可以对十六进制格式执行相同的操作。

使用sprintf() 的返回值(即“打印”的字符数)将索引推进到缓冲区中,作为下一个十六进制数字对的目标,然后迭代十进制中的每个字符buffer .

请注意,您可以使用第一个 sprintf() 的返回值 (m) 进行迭代,而不是测试 nul。

char hexbuffer[64];
int index = 0 ;
for(int i = 0; i < m; i++)
{
    index += sprintf( &hexbuffer[index], "%02X", buffer[i] ) ;
}

当然,如果输入仅包含十进制数字(即用户没有在buffer[0] 处输入导致- 的负值,您可以简单地在每个十进制数字前插入一个3,因此:

char hexbuffer[64];
for(int i = 0; i < m; i++)
{
    bexbuffer[i * 2] = '3' ;
    hexbuffer[i * 2 + 1] = buffer[i] 
}

如果只需要十进制数字,您应该将a 的类型更改为unsigned,并使用%u 格式说明符作为十进制输入。

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 2016-07-26
    • 2016-04-30
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多