繁体   English   中英

如何将十进制ASCII字符串转换为C中的整数数组?

[英]How to convert a decimal ascii string to integer array in C?

我已经编写了一个使用IPv6地址的程序,并且我需要将四整数数组转换为代表IPv6地址数量的十进制字符串的代码[1]。 现在,我遇到了需要做反向操作的情况:将可能表示为单个字符串的大量数字(不适合uint32_tuint64_t ,因此atol()strtol()在这里无能为力)表示为四个整数或byteuint8_t )数组(我将[1]的函数从4-int转换为variable-uint8_t)。

有什么办法吗?

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

谢谢。 这是我在这里的第一个问题,对英语不好(如果有的话)表示抱歉。

建议使用库时出现这种情况。

使用GMP ,您可以进行以下转换(gmp.c):

#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>

int main(int argc, char *argv)
{
  // From string
  char *s ="199999999999999999999999999999999999999";
  mpz_t i;
  // To big number, using GMP
  // 10 here means base 10.
  mpz_init_set_str(i, s, 10);
  // Just to test if s is 128 bits long
  printf("%s can be represented with %d digits in base 2\n",s, mpz_sizeinbase(i, 2));
  // Then you can print it in hex
  gmp_printf("%#32ZX\n", i);
  // Or convert it back to int[4]
  unsigned int a[4];
  mpz_export(&a, NULL, 1, 4, 0, 0, i);
  for(int x=0;x<4;x++)
      printf("%X\n", a[x]); 
  mpz_clear(i);
  return 0;
} 

输出:

199999999999999999999999999999999999999 can be represented with 128 digits in base 2
0X96769950B50D88F41314447FFFFFFFFF
96769950
B50D88F4
1314447F
FFFFFFFF

我在32位Linux系统上测试了此代码。 请注意不同平台上不同的int大小和字节序。 您可能希望结果为大端,如果是这样,只需将mz_export更改为:

mpz_export(&a, NULL, 1, 4, 1, 0, i);

要编译该示例,请不要忘记在gcc命令行参数上安装gmp并添加-lgmp -std = c99。

在Ubuntu上,您可以使用以下命令安装gmp:

sudo apt-get install libgmp-dev

并编译示例gmp.c:

gcc gmp.c -o gmp -lgmp -std=c99

这段代码可以为您的转换提供一个良好的开端。 您也可以将i初始化为固定的128位数字(使用GMP的init函数),以防万一您的大数字以零开头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM