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

标签 c++ arrays arduino 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() {
}

循环将继续转换,直到遇到空字符。此外,getNum 中使用的代码仅处理小写值。如果您需要解析大写值,这很容易改变。如果您需要解析两者,那么它只需要多一点代码,如果需要,我会把它留给您(如果您无法解决并需要它,请告诉我)。

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

AB
CD
EF
98

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

循环不关心有多少数据,只要有偶数个输入(输出的每个字节有两个 ascii 字符)加上一个终止 null。当它遇到以 null 结尾的输入字符串时,它就会停止转换。

所以要在上面的草图中做更长的转换,你只需要改变输出的长度(以容纳更长的数字)。即:

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

循环内的 4 没有改变。它正在将第一个数字移动到位。

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

关于c++ - 如何将字符数组转换为字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581925/

相关文章:

c++ - 使用常量是否节省内存

arduino - 将表示为字符串的 MAC 地址转换为 uint8_t,Arduino

c++ - 在另一个文件中定义匿名类的方法

c++ - 使用 glOrtho() 时 gluLookAt() 不起作用?

c++ - 我的函数链不想工作,为什么?

c++ - 通过键盘将数字输入数组但只有 1 行

php - 如何将数组值推送到 json 字符串中

javascript - MongoDB/NPM mongojs 包/更改一级深度数组

c++ - 如何让用户输入声明字符串数组的大小?

c++ - 通过指针访问时的字节大小