【问题标题】:Converting a long char array of number to byte array将数字的长字符数组转换为字节数组
【发布时间】:2011-01-26 16:46:49
【问题描述】:

如何将数字的 char 数组转换为字节数组? 示例:

char *digit="3224833640520308023"//long long array 

转换为:

uint8_t buff[256]= {0x2c, 0xc0, 0xe9, 0x1c, 0x32, 0xf1, 0x55, 0x37, 0};

(2c c0 e9 1c 32 f1 55 37)

【问题讨论】:

  • 如果你把你的代码放在一个单独的段落中,并且每行缩进至少四个空格,它的格式会更好,人们也更容易回答你的问题。
  • char数组的内容和你的uint8_t数组的内容是什么关系?
  • 我认为您想接受一个表示数字的字符串,转换为 long long,然后将其作为具有二进制表示的 uint8_t 数组?还是您想自动将其转换为您列出的 C 语句?您介意沉迷于技术上未定义的行为吗?
  • 你的“数字”是一组单独的 ASCII 字符吗?一个巨大的十进制字符串?一组十六进制数字?请澄清...
  • 大数(3224833640520308023)转换为十六进制(2cc0e91c32f15537)

标签: c arrays char


【解决方案1】:

最后我以相反的顺序打印。如果您需要按照该字节序排列的数组,您可能需要进行字节序交换。

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

char *digit="3224833640520308023";

int  main() {
  int i;
  unsigned char byteArray[16];
  unsigned long long x = strtoull(digit,0,10);

  printf("%llx\n",x);
  printf("%llu\n",x);
  for (i=0;i<8;i++) {
    byteArray[i] = (x>>(i*8)) & 0xFF;
  }

  printf ("Array is:\n");
  for (i=7;i>=0;i--) {
    printf("%2.2x ",byteArray[i]);
  }
  return 0;
}

【讨论】:

  • 您可以强制转换对数组的引用,而不是显式创建每个值。 reinterpret_cast(&x)[i] (假设字节序)应该可以解决问题
  • 我的设备打印显示:2cc0e91c 750840092 数组是:00 00 00 00 2c c0 e9 1c
  • 嗯,是的——这是 C(不是 C++),所以“reinterpret_cast”不起作用——但我可以有“(unsigned char *) (&x)”
【解决方案2】:

strtoull 将字符串转换为 64 位内部表示。

如果您的平台需要,htobe64 会将字节序切换为大字节序(您在示例中使用的那个)。

然后,您可以从这个大端 64 位变量中复制 8 个字节到您的字节数组中。

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

char *digit="3224833640520308023";

main ()
{
    uint64_t ull;
    uint64_t beull;
    uint8_t buff[8];
    int i;

    ull=strtoull(digit,0,10);
    beull=htobe64(ull);
    memcpy(buff,&beull,8);
    for(i=0;i<8;i++)
    {
        printf("%02x\n",buff[i]);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多