[英]How to convert a char array to a byte array?
我正在處理我的項目,現在遇到了一個問題,即如何將char數組轉換為字節數組?
例如:我需要將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
使用的代碼僅處理小寫值。 如果您需要解析大寫值,則可以輕松更改。 如果您需要同時解析這兩個代碼,則只需要一點點代碼,如果需要的話,我會留給您(如果您無法解決並需要它,請告訴我)。
這將輸出到串行監控包含在4個字節值out
轉換之后。
AB
光盤
英孚
98
編輯:如何使用不同的長度輸入。
只要輸入數為偶數(輸出的每個字節為兩個ascii字符)加上一個終止的空值,循環就不會關心有多少數據。 當它碰到終止為null的輸入字符串時,它只是停止轉換。
因此,要在上面的草圖中進行更長的轉換,只需更改輸出的長度(以容納更長的數字)。 即:
char arr[] = "abcdef9876543210";
byte out[8];
循環內的4
不變。 它正在將第一個數字移到位置。
對於前兩個輸入( "ab"
),代碼首先將'a'轉換為數字10
或十六進制A
然后將其左移4位,因此它位於字節的高四位: 0A
至A0
。 然后,將第二個值B
簡單地添加到給出AB
的數字上。
只需將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]);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.