【发布时间】:2016-10-01 14:30:25
【问题描述】:
我正在处理我的项目,现在我遇到了一个问题,即如何将 char 数组转换为 byte 数组?。
例如:我需要将char[9]"fff2bdf1"转换为一个字节数组,即byte[4]是0xff,0xf2,0xbd,0xf1。
【问题讨论】:
-
所以你想解析十六进制值?
我正在处理我的项目,现在我遇到了一个问题,即如何将 char 数组转换为 byte 数组?。
例如:我需要将char[9]"fff2bdf1"转换为一个字节数组,即byte[4]是0xff,0xf2,0xbd,0xf1。
【问题讨论】:
这是一个小 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 位,因此它位于字节的高四位:0A 到 A0。然后将第二个值B 简单地添加到给出AB 的数字。
【讨论】:
char arr[] = "ABCDEF98"
只需将 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;
}
【讨论】:
假设您要解析字符串中的十六进制值,并且两个字母始终构成一个字节值(因此您使用前导零),您可以像这样使用sscanf:
char input[] = "fff2bdf1";
unsigned char output[4];
for (int i=0; i<4; i++) {
sscanf(&input[i*2], "%02xd", &data[i]);
}
【讨论】: