c - 如何将一个 5 字节的十六进制数转换为 10 进制数并用 C 类型字符串表示?

标签 c

我有一个由 5 个字节组成的十六进制数:0xEEDDCCBBAA。这个数字存储在一个数组中:[0xEE 0xDD, 0xCC, 0xBB, 0xAA]。我想将它转换为 10base 十进制数并将其表示为 C 类型字符串:“1025923398570”。 (0xEEDDCCBBAA 等于 1,025,923,398,570)

一个问题是我的系统只支持最大。 32 位类型的变量,所以我不能用一个变量来存储这个数字或执行任何类型的大于 32 位的操作。例如我不能这样做:

unsigned long long val = 0xeeddccbbaa;
unsigned char buf[50];
sprintf(buf, "%d", val);

非常感谢。

编辑:因为我的问题看起来很困惑,所以我重新写了一遍。

最佳答案

可以创建一个通用例程来处理任何大小的字节数组。

#include <string.h>

char *convert_10base_decimal_number(char *dest, size_t dsize, unsigned char *a,
    size_t asize) {

  if (dsize == 0)
    return NULL;
  char *d = dest + dsize - 1;
  *d = '\0';
  size_t ai = 0;
  do {
    // mod 10
    unsigned carry = 0;
    for (size_t i = ai; i < asize; i++) {
      carry = carry * 256 + a[i];
      a[i] = carry / 10;
      carry %= 10;
    }
    if (d == dest)
      return NULL;
    d--;
    *d = carry + '0';
    if (a[ai] == 0)
      ai++;
  } while (ai < asize);
  memmove(dest, d, dsize - (d - dest));
  return (dest);
}

int main(void) {
  unsigned char a[] = { 0xEE, 0xDD, 0xCC, 0xBB, 0xAA };
  char buf[50];

  puts(convert_10base_decimal_number(buf, sizeof buf, a, sizeof a));
  // 1025923398570

  return 0;
}

此方法确实使用数组 a

关于c - 如何将一个 5 字节的十六进制数转换为 10 进制数并用 C 类型字符串表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838624/

相关文章:

c - 将数据提供给需要文件名的 C API

c - 查找嵌套结构体成员变量的地址

更改 Win32 窗口的像素

C:随机游走(布朗运动)程序没有返回预期的理论值。为什么?

c - 使用系统日志记录到我自己的日志文件?

java - printf 始终显示 0 处理器时间作为输出

c - 在 Linux 上使用 C 的原始套接字发送失败

c++ - 集群节点的 libmemcached 故障转移

c - c中的单链表输出错误

javascript - 与 C 中的相同值相比,为什么 Javascript 的 Math.pow() 似乎返回一个舍入值?