我正在做我的项目,现在我遇到了一个问题,那就是,我如何将一个字符数组转换为一个字节数组?.例如:我需要将char[9]"fff2bdf1"转换为一个字节数组,即byte[4] is 0xff,0xf2,0xbd,0xf1。
char[9]
"fff2bdf1"
byte[4]
0xff,0xf2,0xbd,0xf1
gfttwv5a1#
下面是一个小的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字节值。ABCDEF98
getNum
out
编辑:如何使用不同长度的输入。
循环不关心有多少数据,只要有偶数个输入(每个输出字节两个ascii字符)加上一个终止null即可。它只是在遇到以null结尾的输入字符串时停止转换。因此,要在上面的草图中进行更长的转换,您只需更改输出的长度(以适应更长的数字)。即:
char arr[] = "abcdef9876543210"; byte out[8];
循环中的4不会改变。它正在将第一个数字移入位置。对于前两个输入("ab"),代码首先将“a”转换为数字10或十六进制A。然后它将其左移4位,因此它驻留在字节的高四位:0A到A0。然后,第二个值B简单地添加到数字AB。
4
"ab"
10
A
0A
A0
B
AB
uqdfh47h2#
假设你想解析字符串中的十六进制值,并且两个字母总是组成一个字节值(所以你使用前导零),你可以像这样使用sscanf:
sscanf
char input[] = "fff2bdf1"; unsigned char output[4]; for (int i=0; i<4; i++) { sscanf(&input[i*2], "%02xd", &output[i]); }
ddhy6vgd3#
只需将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条答案
按热度按时间gfttwv5a1#
下面是一个小的Arduino草图,说明了一种方法来做到这一点:
循环将继续转换,直到遇到空字符。另外,
getNum
中使用的代码只处理小写值。如果你需要解析大写的值,这是一个很容易的改变。如果你需要解析这两个,那么它只是一个小更多的代码,我会留给你,如果需要的话(让我知道,如果你不能解决它,需要它)。这将在转换后向串行监视器输出
out
中包含的4字节值。AB
CD
EF
98
编辑:如何使用不同长度的输入。
循环不关心有多少数据,只要有偶数个输入(每个输出字节两个ascii字符)加上一个终止null即可。它只是在遇到以null结尾的输入字符串时停止转换。
因此,要在上面的草图中进行更长的转换,您只需更改输出的长度(以适应更长的数字)。即:
循环中的
4
不会改变。它正在将第一个数字移入位置。对于前两个输入(
"ab"
),代码首先将“a”转换为数字10
或十六进制A
。然后它将其左移4位,因此它驻留在字节的高四位:0A
到A0
。然后,第二个值B
简单地添加到数字AB
。uqdfh47h2#
假设你想解析字符串中的十六进制值,并且两个字母总是组成一个字节值(所以你使用前导零),你可以像这样使用
sscanf
:ddhy6vgd3#
只需将0或1移位到其二进制格式的位置:)
例2.但没有测试!