我正在处理一个项目,现在遇到了一个问题:如何将字符数组转换为字节数组?
例如:我需要将char[9]
"fff2bdf1"
转换为一个字节数组byte[4]
,即0xff,0xf2,0xbd,0xf1
。
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字节值到串行监视器。
编辑:如何使用不同长度的输入。 循环并不关心有多少数据,只要有偶数个输入(每个输出字节的两个ASCII字符)再加上单个终止空字符即可。它只是在遇到输入字符串的终止空字符时停止转换。AB
CD
EF
98
char arr[] = "abcdef9876543210";
byte out[8];
4
不会改变,它将第一个数字移动到位置上。对于前两个输入("ab"
),代码首先将'a'转换为数字10
或十六进制A
。然后将其左移4位,使其位于字节的高4位:0A
变成了A0
。然后将第二个值B
添加到该数字,得到AB
。char arr [] =“ABCDEF98”
- MICROsscanf
:char input[] = "fff2bdf1";
unsigned char output[4];
for (int i=0; i<4; i++) {
sscanf(&input[i*2], "%02xd", &output[i]);
}
0x31
这样的格式,就像问题中要求的那样。 - undefined只需将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;
}