首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中将十进制ascii字符串转换为整数数组?

如何在C中将十进制ascii字符串转换为整数数组?
EN

Stack Overflow用户
提问于 2012-10-09 01:28:58
回答 1查看 2K关注 0票数 1

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

有没有办法做到这一点?

1

谢谢。这是我在这里的第一个问题,所以如果有糟糕的英语,我很抱歉。

EN

回答 1

Stack Overflow用户

发布于 2012-10-09 18:04:16

这就是建议使用库时的情况。

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

代码语言:javascript
复制
#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;
} 

输出:

代码语言:javascript
复制
199999999999999999999999999999999999999 can be represented with 128 digits in base 2
0X96769950B50D88F41314447FFFFFFFFF
96769950
B50D88F4
1314447F
FFFFFFFF

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

代码语言:javascript
复制
mpz_export(&a, NULL, 1, 4, 1, 0, i);

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

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

代码语言:javascript
复制
sudo apt-get install libgmp-dev

并编译示例gmp.c:

代码语言:javascript
复制
gcc gmp.c -o gmp -lgmp -std=c99

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12786580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档