簡體   English   中英

如何將字符數組轉換為字節數組?

[英]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位,因此它位於字節的高四位: 0AA0 然后,將第二個值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM