Как преобразовать char в byte
- Войдите на сайт для отправки комментариев
Втр, 13/12/2016 - 11:20
Допустим есть строка со значениями d9 a8 b6 c4 A 2, размер строки фиксирован, значения в строке необходимо из char преобразовать в byte. Как это можно сделать?
Первые 4 символа "d9 a8 b6 c4" должны быть записаны в массив типа byte, остальные.
А сами Вы пробовали? Покажите свой код.
А сами Вы пробовали? Покажите свой код.
Проще жеж спросить )))
а тут посмотреть сложно
Как то так можно сделать:
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); }Как то так можно сделать:
Так нельзя.
Вернее. сделать-то можно, только не будет не то, что работать, а даже компилироваться.
Ну что значит не компилируется, неужели так трудно исправить пару мелочей в коде написанном всухомятку.
Вот исправил. И даже проверил.
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. Впрочем, это ж только отладочный вывод.неужели так трудно исправить пару мелочей
В том-то и проблема работы с новичками. Если бы ТС не было трудно, он бы не пришёл сюда с такими вопросами. С ними потщательнЕе надо.