c - 如何在 C 中将 128 位整数转换为十进制 ascii 字符串?

标签 c string int ascii

我正在尝试将存储为 4 个无符号整数数组的 128 位无符号整数转换为 C 中的十进制字符串表示形式:

unsigned int src[] = { 0x12345678, 0x90abcdef, 0xfedcba90, 0x8765421 };
printf("%s", some_func(src)); // gives "53072739890371098123344"

(上面的输入和输出示例完全是虚构的;我不知道该输入会产生什么。)

如果我要使用十六进制、二进制或八进制,这将是一个简单的掩码和位移位问题,以剥离最低有效字符。但是,在我看来,我需要以 10 为基数除法。不幸的是,我不记得如何跨多个整数执行此操作,而且我使用的系统不支持大于 32 位的数据类型,因此无法使用 128 位类型。使用不同的语言也是不可能的,我宁愿避免仅仅为了这个操作而使用大数字库。

最佳答案

除法是不必要的:

#include <string.h>
#include <stdio.h>

typedef unsigned long uint32;

/* N[0] - contains least significant bits, N[3] - most significant */
char* Bin128ToDec(const uint32 N[4])
{
  // log10(x) = log2(x) / log2(10) ~= log2(x) / 3.322
  static char s[128 / 3 + 1 + 1];
  uint32 n[4];
  char* p = s;
  int i;

  memset(s, '0', sizeof(s) - 1);
  s[sizeof(s) - 1] = '\0';

  memcpy(n, N, sizeof(n));

  for (i = 0; i < 128; i++)
  {
    int j, carry;

    carry = (n[3] >= 0x80000000);
    // Shift n[] left, doubling it
    n[3] = ((n[3] << 1) & 0xFFFFFFFF) + (n[2] >= 0x80000000);
    n[2] = ((n[2] << 1) & 0xFFFFFFFF) + (n[1] >= 0x80000000);
    n[1] = ((n[1] << 1) & 0xFFFFFFFF) + (n[0] >= 0x80000000);
    n[0] = ((n[0] << 1) & 0xFFFFFFFF);

    // Add s[] to itself in decimal, doubling it
    for (j = sizeof(s) - 2; j >= 0; j--)
    {
      s[j] += s[j] - '0' + carry;

      carry = (s[j] > '9');

      if (carry)
      {
        s[j] -= 10;
      }
    }
  }

  while ((p[0] == '0') && (p < &s[sizeof(s) - 2]))
  {
    p++;
  }

  return p;
}

int main(void)
{
  static const uint32 testData[][4] =
  {
    { 0, 0, 0, 0 },
    { 1048576, 0, 0, 0 },
    { 0xFFFFFFFF, 0, 0, 0 },
    { 0, 1, 0, 0 },
    { 0x12345678, 0x90abcdef, 0xfedcba90, 0x8765421 }
  };
  printf("%s\n", Bin128ToDec(testData[0]));
  printf("%s\n", Bin128ToDec(testData[1]));
  printf("%s\n", Bin128ToDec(testData[2]));
  printf("%s\n", Bin128ToDec(testData[3]));
  printf("%s\n", Bin128ToDec(testData[4]));
  return 0;
}

输出:

0
1048576
4294967295
4294967296
11248221411398543556294285637029484152

关于c - 如何在 C 中将 128 位整数转换为十进制 ascii 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653086/

相关文章:

c++ - 在 C 中的 _asm block 中使用局部变量

iOS 6 无法检查仅包含字母数字字符的字符串

r - 在长度超过 n 个字符的单词之间包含空格

arrays - 当数组长度不为空时转到 “panic: runtime error: index out of range”

list - 将整数列表显示为字符串

2D int fill 函数的转换错误

c++ - 将 int 转换为 Glib::ustring w/o stringstream

c - C 中不使用函数查找字符串的最后一个字符

c++ - 错误地计算增量

c - 如何编译用 C 编写的 64 位 dll?