【问题标题】:Integer conversion to Hexadecimal String in C without (sprintf/printf libraries) [duplicate]没有(sprintf / printf库)的C中的整数转换为十六进制字符串[重复]
【发布时间】:2017-06-16 15:51:23
【问题描述】:

我有这些输入变量:

 uint16 temperature = 0x1f12;
 uint8 array[8] = {0,0,0,...0}

我想拥有

array8[0] = '1';
array8[1] = 'f';
array8[2] = '1';
array8[3] = '2';
array8[4] = '\0';
array8[5] = '\0';
array8[6] = '\0';
array8[7] = '\0';

但是,对于内存问题(我正在使用微控制器!)我需要避免使用 sprintf、printf、puts 等函数。

我该怎么办?

最好的问候,

【问题讨论】:

  • 只需移动和屏蔽这些值。如果介于 0 和 9 之间,则添加 '0',否则添加 'A'-10
  • 否则添加'a' - 10,即'W'
  • 应该array[] 写前导0 数字吗?示例:应该temperature = 0x123 --> "123""0123" 还是没有区别?
  • 您的编辑破坏了现有答案。此外,array8 = '1f12' 没有任何意义。请回滚您的问题。

标签: c printf


【解决方案1】:

此代码仅使用堆栈中的 8 个额外字节 (int i, j)。

int i;
for (i = 0; i < 8; i++) {
    array[7 - i] = temperature % 16;
    temperature /= 16;

    if (temperature == 0)
        break;
}

if (i == 8)
    i--;

int j;
for (j = 0; j <= i; j++)
    array[j] = array[7 - i + j];
for (j = i + 1; j < 8; j++)
    array[j] = 0;

for (j = 0; j < 8; j++)
    if (array[j] < 10)
        array[j] += '0';
    else
        array[j] += 'a' - 10;

此代码首先将temperature = 0x1f12 转换为array[8] = { 0, 0, 0, 0, 1, 15, 1, 2}

然后移动array的元素,使其变为array[8] = { 1, 15, 1, 2, 0, 0, 0, 0 }

然后将数字转换为对应的字符:array[8] = { '1', 'f', '1', '2', '0', '0', '0', '0' }

还要注意这个 if 条件

    if (i == 8)
        i--;

永远不会满足,因为在第一个 for 循环中总是满足中断条件,即使温度 >= 0x10000000。它只是在那里,希望它可以帮助某人理解这段代码。

【讨论】:

  • temperature = 0x123,这个答案形成数组"12300000",当然不是OP的目标。
  • @chux 我认为这就是 OP 想要的......
  • OP 对 this 的依赖是 "123",尽管 OP 确实接受了你的回答,嗯。
  • 对不起我的 C 级别...我想要 @nglee 发布的内容。谢谢大家的帮助。
【解决方案2】:

使用递归一次确定 1 个十六进制数字。

// print digit at the end and return the next address
static char *itohexa_helper(char *dest, unsigned x) {
  if (x >= 16) {
    dest = itohexa_helper(dest, x/16);
  }
  *dest++ = "0123456789abcdef"[x & 15];
  return dest;
}

char *itohexa(char *dest, unsigned x) {
  *itohexa_helper(dest, x) = '\0';
  return dest;
}

int main(void) {
  char array[8];
  uint16_t temperature = 0x1f11;
  puts(itohexa(array, temperature));
  puts(itohexa(array, 0));
  puts(itohexa(array, 0x1234567));
  puts(itohexa(array, UINT_MAX & 0xFFFFFFF));
}

输出

1f11
0
1234567
fffffff

【讨论】:

  • 不是我的反对票,而是它以相反的顺序生成数字。
  • @Jean-FrançoisFabre 是的。我第一次写它是颠倒的,因为这是最有意义的,但后来误读了 OP 的期望顺序。嗯uint16 temperature = 0x89ab; 会更清楚。会反转。
  • @Jean-FrançoisFabre 已修复。
  • @Stargateur 有趣。
【解决方案3】:
int convert()
{
 uint16_t temperature = 0x1f11;
 uint8_t array[8] = {0,0,0,0,0,0,0,0};

 int i = 0;

 for(i = 0; i < 8; i++){
    array[i] = (0xf000 & temperature) >> 12 ;
    temperature <<= 4;
    printf("array[%d] = %x\n", i ,array[i]);
 }
 return(0);
}

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 2012-07-21
    • 2021-11-05
    • 2015-11-29
    • 2018-01-31
    相关资源
    最近更新 更多