【问题标题】:How to convert a char array to a byte array?如何将 char 数组转换为 byte 数组?
【发布时间】:2016-10-01 14:30:25
【问题描述】:

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

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

【问题讨论】:

  • 所以你想解析十六进制值?

标签: c++ arrays arduino char


【解决方案1】:

这是一个小 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。它只是在遇到以 null 结尾的输入字符串时停止转换。

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

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

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

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

【讨论】:

  • 感谢您的评论。我正在尝试理解您的代码并将其编辑为 6 字节数组的情况。我将数字“4”编辑为 6,但它不起作用。你能进一步解释一下你的代码吗?
  • @TrungPhạmKhánh 我已经用解释编辑了问题的结尾。
  • 如何只解析大写?如果char arr[] = "ABCDEF98"
【解决方案2】:

只需将 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; 
}

【讨论】:

  • 你能解释一下你的代码中发生了什么吗?我不明白这是如何解析十六进制值的。
【解决方案3】:

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

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

【讨论】:

  • 什么是数据,&data[i]
猜你喜欢
  • 2011-06-08
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2019-03-08
  • 2010-12-02
  • 1970-01-01
  • 2020-11-12
  • 2011-03-05
相关资源
最近更新 更多