如何将字符数组转换为字节数组?

3

我正在处理一个项目,现在遇到了一个问题:如何将字符数组转换为字节数组?

例如:我需要将char[9] "fff2bdf1" 转换为一个字节数组byte[4],即0xff,0xf2,0xbd,0xf1


所以你想解析十六进制值? - Karsten Koop
3个回答

4
这里有一份小的Arduino范例程序,演示了如何实现这一功能:
void setup() {
  Serial.begin(9600);

  char arr[] = "abcdef98";
  byte out[4];
  auto getNum = [](char c){ return c > '9' ? c - 'a' + 10 : c - '0'; };
  byte *ptr = out;

  for(char *idx = arr ; *idx ; ++idx, ++ptr ){
    *ptr = (getNum( *idx++ ) << 4) + getNum( *idx );
  }


  //Check converted byte values.
  for( byte b : out )
    Serial.println( b, HEX );  
}

void loop() {
}

循环将继续转换,直到遇到空字符。此外,在getNum中使用的代码仅处理小写值。如果您需要解析大写值,则易于更改。如果您需要解析两者,则只需要稍微编写一些代码,如果需要请告诉我(让我知道您是否无法解决并需要它)。
这将输出转换后out包含的4字节值到串行监视器。

AB
CD
EF
98

编辑:如何使用不同长度的输入。 循环并不关心有多少数据,只要有偶数个输入(每个输出字节的两个ASCII字符)再加上单个终止空字符即可。它只是在遇到输入字符串的终止空字符时停止转换。
因此,要在上述草图中进行较长的转换,您只需要更改输出的长度(以适应更长的数字)。例如:
char arr[] = "abcdef9876543210";
byte out[8];

循环中的4不会改变,它将第一个数字移动到位置上。对于前两个输入("ab"),代码首先将'a'转换为数字10或十六进制A。然后将其左移4位,使其位于字节的高4位:0A变成了A0。然后将第二个值B添加到该数字,得到AB

谢谢您的评论。 我正在尝试理解您的代码并将其编辑为6个字节的数组情况。我已经将数字“4”编辑为6,但它没有起作用。 您能否进一步解释一下您的代码? - Trung Phạm Khánh
@TrungPhạmKhánh 我已经编辑了问题的结尾并附上了解释。 - Chris A
如何解析只有大写字母?如果char arr [] =“ABCDEF98” - MICRO

2
假设您想解析字符串中的十六进制值,并且两个字母始终组成一个字节值(因此使用前导零),您可以像这样使用sscanf
char input[] = "fff2bdf1"; 
unsigned char output[4];
for (int i=0; i<4; i++) {
  sscanf(&input[i*2], "%02xd", &output[i]);
}

什么是数据,以及 &data[i] - mehmet
这应该是被接受的答案,因为这个解决方案实际上提供了像“0x31”这样的格式,就像所要求的那样。 - Captain Allergy
这个答案应该被接受,因为这个解决方案实际上提供了像0x31这样的格式,就像问题中要求的那样。 - undefined

-1

只需将0或1移动到其二进制格式中的位置即可 :)

char lineChars[8] = {1,1,0,0,0,1,0,1}; 
    char lineChar = 0;
    for(int i=0; i<8;i++)
    {
        lineChar |= lineChars[i] << (7-i);
    }

例子2。但未经测试!

void abs()
{
  char* charData = new char;
  *charData = 'h';
  BYTE* byteData = new BYTE;
  *byteData = *(BYTE*)charData; 
}

1
你能再解释一下你的代码在做什么吗?我不明白它是如何解析十六进制值的。 - Karsten Koop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接