如何将 char 数组转换为 byte 数组?

新手上路,请多包涵

我正在处理我的项目,现在我遇到了一个问题,即如何将 char 数组转换为 byte 数组?

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

原文由 Trung Phạm Khánh 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

这是一个小 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

光盘

英孚

98

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

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

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

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

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

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

原文由 Chris A 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Karsten Koop 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题