我正在处理我的项目,现在我遇到了一个问题,即如何将char数组转换为字节数组?
例如:我需要将char[9]
"fff2bdf1"
转换为byte[4]
为0xff,0xf2,0xbd,0xf1
的字节数组。
答案 0 :(得分:3)
这是一个小的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的输入字符串时,它只是停止转换。
因此,要在上面的草图中进行更长时间的转换,您只需要更改输出的长度(以适应更长的数字)。即:
char arr[] = "abcdef9876543210";
byte out[8];
循环内的4
没有变化。它正在将第一个数字转移到位。
对于前两个输入("ab"
),代码首先转换&#39; a&#39;到数字10
或十六进制A
。然后它将其向左移位4位,因此它位于字节的高4位:0A
到A0
。然后,第二个值B
只会添加到给出AB
的数字中。
答案 1 :(得分:0)
只需将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;
}
答案 2 :(得分:0)
假设您要解析字符串中的十六进制值,并且两个字母总是构成一个字节值(因此您使用前导零),您可以使用sscanf
,如下所示:
char input[] = "fff2bdf1";
unsigned char output[4];
for (int i=0; i<4; i++) {
sscanf(&input[i*2], "%02xd", &data[i]);
}