Как преобразовать char в byte

legionprorok
Offline
Зарегистрирован: 01.02.2016

Допустим есть строка со значениями d9 a8 b6 c4 A 2, размер строки фиксирован, значения в строке необходимо из char преобразовать в byte. Как это можно сделать?

Первые 4 символа "d9 a8 b6 c4" должны быть записаны в массив типа byte, остальные. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А сами Вы пробовали? Покажите свой код.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

А сами Вы пробовали? Покажите свой код.

Проще жеж спросить )))
а тут посмотреть сложно

_kp
Offline
Зарегистрирован: 07.10.2016

Как то так можно сделать:


uint8_t data[4]; //результат

//Функция разбора входной строки
bool parse_hex_values(char pInStr) // "d9 a8 b6 c4"
{
bool fail=false;
unsigned value; //признак ошибки

  for(uint8_t i=0;< i<4; i++){   //Читаем 4 числа 
    if ( ! read_digits_hex(pInStr,&value) ){ fail=true; break; } //read hex
    data[i]=value; 
    pInStr++; //пропуск пробела
  } 

 
   Serial.printf(F(" pInStr=\"%s\"  data= %02X %02X %02X %02X  fail=%u"), pInStr, data[0],data[1],data[2],data[3], fail==true); //dbg

   return fail;
}


//Читаем число пока не попадется не HEX цифра
bool  read_digits_hex(char *s, *unsigned val)
{
uint Digits; //считано цифр
     *val=0;           

     for(Digits=0;;Digits++){ //read digits. stop on any non digit symbol or EOL.
           uint8_t Sym= *s; //read char
           if( Sym == 0 ) break; //EOL?
           if(         (Sym>='0') && (Sym<='9') ) Sym -= '0';
           else if(    (Sym>='A') && (Sym<='F') ) Sym -= ('A'-10);
             else  if( (Sym>='a') && (Sym<='f') ) Sym -= ('a'-10);
               else break;
           Value*=16; Value+=Sym; //no overflow chec for avr
           s++;
      }
      return (Digits>0);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

_kp пишет:

Как то так можно сделать:

Так нельзя.

Вернее. сделать-то можно, только не будет не то, что работать, а даже компилироваться.

_kp
Offline
Зарегистрирован: 07.10.2016

Ну что значит не компилируется, неужели так трудно исправить пару мелочей в коде написанном всухомятку.
Вот исправил. И даже проверил.


char    InStr[30]="de ad C0 de";   
uint8_t data[4]; //результат

//Функция разбора входной строки
uint8_t  parse_hex_values(char *pInStr) // "d9 a8 b6 c4"
{
uint8_t fail=0; //признак ошибки
unsigned value; 
   
  for(uint8_t i=0; i<4; i++){   //Читаем 4 числа 
    if ( ! read_digits_hex(pInStr,&value) ){ fail=1; break; } //read hex
    data[i]=value; 
    pInStr+=3; //перход к следующему числу. пропуск 2х цифр и пробела
  } 
 
//   Serial.printf(F(" pInStr=\"%s\"  data= %02X %02X %02X %02X  fail=%u"),  pInStr, data[0],data[1],data[2],data[3], fail==true); //dbg
   return !fail;
}


//Читаем число пока не попадется не HEX цифра
uint8_t   read_digits_hex(char *s, unsigned *value)
{
uint8_t Digits; //считано цифр
     *value=0;           

     for(Digits=0;;Digits++){ //read digits. stop on any non digit symbol or EOL.
           uint8_t Sym= *s; //read char
           if( Sym == 0 ) break; //EOL?
           if(         (Sym>='0') && (Sym<='9') ) Sym -= '0';
           else if(    (Sym>='A') && (Sym<='F') ) Sym -= ('A'-10);
             else  if( (Sym>='a') && (Sym<='f') ) Sym -= ('a'-10);
               else break;
           *value *=16; *value +=Sym; //no overflow chec for avr
           s++;
      }
      return (Digits>0);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);




 
   if ( ! parse_hex_values(InStr ) ){ 
     Serial.println("Wrong string"); 
   }else{
     Serial.printf(F(" pInStr=\"%s\"  data= %02X %02X %02X %02X "),  InStr, data[0],data[1],data[2],data[3]); //dbg
    
   }
   

}

void loop() {
  // put your main code here, to run repeatedly:

  
}


/*
Result:
   pInStr="de ad C0 de"  data= DE AD C0 DE 
*/

ps: Кому не нравится Serial.printf и иже с ними,  могут заменить их на пару десятков print/println. Впрочем, это ж только отладочный вывод.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

_kp пишет:

неужели так трудно исправить пару мелочей 

В том-то и проблема работы с новичками. Если бы ТС не было трудно, он бы не пришёл сюда с такими вопросами. С ними потщательнЕе надо.