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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将char数组转换为字节数组?相关的知识,希望对你有一定的参考价值。

我正在研究我的项目,现在我遇到了一个问题,即如何将char数组转换为字节数组?

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

答案

这是一个小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() {
}

循环将继续转换,直到它遇到空字符。此外,getNumonly中使用的代码处理小写值。如果需要解析大写值,则可以轻松更改。如果你需要解析它们只需要更多的代码,我会在需要时留给你(如果你不能解决它并且需要它,请告诉我)。

这将在转换后将out中包含的4字节值输出到串行监视器。

AB 光盘 EF 98

编辑:如何使用不同长度的输入。

只要有偶数个输入(输出的每个字节有两个ascii字符)加上一个终止空值,循环就不关心有多少数据。它只是在命中终止null的输入字符串时停止转换。

因此,要在上面的草图中进行更长时间的转换,您只需要更改输出的长度(以适应更长的数字)。即:

char arr[] = "abcdef9876543210";
byte out[8];

循环中的4不会改变。它正在将第一个数字转移到位。

对于前两个输入("ab"),代码首先将'a'转换为数字10或十六进制A。然后它将它向左移位4位,因此它位于字节的高四位:0AA0。然后将第二个值B添加到给出AB的数字中。

另一答案

只需将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; 
}
另一答案

假设您要解析字符串中的十六进制值,并且两个字母总是组成一个字节值(因此您使用前导零),您可以像这样使用sscanf

char input[] = "fff2bdf1"; 
unsigned char output[4];
for (int i=0; i<4; i++) {
  sscanf(&input[i*2], "%02xd", &data[i]);
}

以上是关于如何将char数组转换为字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节从char数组转换为int

将 char 数组转换为字节数组并再次返回

在C++中,如何把字节数组转换成字符串

如何在C ++中将字节数组中的整数转换为数字

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?

java中如何将一个字符串赋给一个数组