【问题标题】:How to convert str number from dec to hex如何将 str 数字从 dec 转换为 hex
【发布时间】:2021-05-20 11:24:40
【问题描述】:

你好,我有这样的变量:

uint8_t *str value = "100663296";

我只是不想转换为 str 的十六进制解释。 我不需要对此变量进行任何数学运算。

uint8_t *output value = "6000000";

如何正确操作?我不能使用 convert to int 和 sprintf 因为我的 MCU 上没有内存。

【问题讨论】:

  • 您会如何手动操作?以十进制表示连续除以 16,得到一个接一个的数字。您可能正在尝试类似的方法,重用已评估的十进制字符串的字符。这应该起作用,因为目标基数大于源基数。之后不要忘记恢复生成的字符串。
  • 如果 printf 本身的代码太大:许多微控制器的编译器提供了排除浮点转换的方法,这是最复杂的。也许你应该检查一下。
  • 您知道将十进制数转换为十六进制所涉及的数学吗?如果你不这样做,你需要先学习数学。如果你这样做了,那么只需在 C++ 中逐字实现数学。
  • itoa() 有足够的内存吗?无论是包含其他人的代码还是编写自己的代码,您至少需要足够的精简版本。
  • @TimRandall 考虑到 first answer given 的 cmets,我认为问题在于 printf 函数——因为意外启用了浮点转换。

标签: c++ type-conversion


【解决方案1】:

更新:错过了关于 MCU 和内存限制的部分 :) 这个答案没有用

您可以尝试执行以下操作:

  • 将数字的字符串表示形式转换为整数值(可以使用int atoi( const char * str ); 函数
  • 获得整数后,您可以使用例如sprintf 函数将其打印为十六进制,将%x 作为格式参数,将整数作为值参数

这是一个工作示例:https://ideone.com/axAPWH

#include <iostream>
using namespace std;
 
int main() {
    int n;
    char hex_val[50];
 
    n = atoi("100663296");
    sprintf(hex_val, "%x", n);
 
    cout << hex_val;
 
    return 0;
}

【讨论】:

  • 这正是作者排除的问题,因为“没有 [ing] memory for”——不管她/他的意思是什么(对于 int/long/long long 来说可能太大了?)。
  • sprintf 是默认的,这在 STM32 编译器上被禁用,当我向编译器添加 -u _printf_float 标志时,程序使用 60% 内存
  • @user22090909 如果我没记错的话,那并不完全正确。 printf 应该可用,但默认情况下不支持浮点数(%f%e%g 等)。您需要该编译器标志来启用浮点转换。
【解决方案2】:

如果可用,可以使用&lt;charconv&gt;

#include <charconv>
#include <cstdio>
#include <cstdlib>

int main() {
  auto const* str = "2147483647";
  errno = 0;
  char* end;
  long i = std::strtol(str, &end, 10);

  if (end == str || errno == ERANGE)
    return 1;

  char out[20];
  auto const [p, err] = std::to_chars(out, out + sizeof out, i, 16);

  if (err != std::errc{})
    return 2;

  *p = 0; // null terminate

  std::puts(out);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2020-02-10
    • 1970-01-01
    • 2021-01-31
    • 2013-02-11
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多