парсинг строки в байтовый массив

Тема в разделе "Arduino & Shields", создана пользователем zsm, 9 июн 2019.

  1. zsm

    zsm Гик

    Всем привет!
    Поделитесь пожалуйста примерами парсинга такой строки из Serial FF:A7:0:7:92:F6:75:F6: в байтовый массив , в каждой ячейке массива должно получится шестнадцатеричное число такого вида - 0x87.
     
  2. vvr

    vvr Инженерище

    А как вы делаете и что у вас получается?
     
  3. zsm

    zsm Гик

    читаю в строку
    Код (C++):
    BUF= Serial.readString();
    потом пытаюсь пихать это в массив с преобразованием
    Код (C++):
     keyID[0] =  BUF [0,HEX]; keyID[1] = BUF [1,HEX]; keyID[2] =  BUF [3,HEX];keyID[3] =  BUF [4,HEX];
    получается на выходе бред
     
    Последнее редактирование: 9 июн 2019
  4. Daniil

    Daniil Гуру

    Тут описание string.
     
  5. b707

    b707 Гуру

    а кто эту строку посылает? Может сразу вместо, например, строки "FF" - посылать шестнадцитиричное 0xFF - парсить будет в разы проще


    - а вот это вам нафик не нужно
     
  6. Asper Daffy

    Asper Daffy Гуру

    На входе - тоже.
     
  7. b707

    b707 Гуру

    дак и весь код не лучше. И чтение - бред - и "трансформация" в HEX
     
  8. DetSimen

    DetSimen Гуру

    Сильно не тестировал, тестируй сам.

    Код (C++):
    char     ParsedString[] = "FF:A7:0:7:92:F6:75:F6";
    uint8_t  ParsedIndex = 0;


    int ArraySizeNeed(const char *AArray) {

        int result = 0;
        char ch;

        bool digitflag = false;

        while ((ch = *AArray++)) {
            if (not isHexadecimalDigit(ch)) {
                digitflag = false;
                continue;
            }
           
            if (digitflag) continue;
           
            digitflag = true;
            result++;
           
        }

        return result;
    }

    uint8_t getDecDigit(char AHexChar) {
        AHexChar = toUpperCase(AHexChar);
        if ((AHexChar >= '0') && (AHexChar <= '9')) return AHexChar - '0';
        return 10 + AHexChar - 'A';
    }

    uint8_t getNextNumber(void) {
        char ch;
        uint8_t result = 0;

        while (true)
        {
            ch = ParsedString[ParsedIndex++];
            if (not isHexadecimalDigit(ch)) break;
            result = (result << 4) | getDecDigit(ch);
        }

        return result;
    }





    void setup() {
        Serial.begin(115200);
        Serial << "Program started\n";
        delay(500);

       
        int ArraySize = ArraySizeNeed(ParsedString);

        Serial << "Array Size Need = " << ArraySize << eoln;


        uint8_t *ReceiveArray = new uint8_t[ArraySize];

        ParsedIndex = 0;

        for (int i = 0; i < ArraySize; i++) {
            ReceiveArray[i] = getNextNumber();
        }


        for (int i = 0; i < ArraySize; i++) {
            Serial.print("0x");
            Serial.print(ReceiveArray[i], HEX);
            Serial.print(' ');
        }

        Serial.println();



        delete[] ReceiveArray;

    }
    01.jpg
     
    Asper Daffy, b707, zsm и 2 другим нравится это.
  9. DetSimen

    DetSimen Гуру

    Корректно работать будет для байт, для бОльших типов данных сам переделаешь, если надо, это несложна
     
    Последнее редактирование: 10 июн 2019
    zsm нравится это.
  10. Asper Daffy

    Asper Daffy Гуру

    Так я это и имел в виду под "входом".
     
  11. zsm

    zsm Гик

    Asper Daffy нравится это.
  12. DetSimen

    DetSimen Гуру

    Нальёшь при случае.
     
    zsm нравится это.
  13. ну елки-палки
    Код (C++):
    if (sscanf("%2X:%2X:%2X", str, out[0], out[1], out[2]) == 3) {

    }
     
  14. DetSimen

    DetSimen Гуру

    дядьВить, а если завтра у него вместо дваиточия чонить другое появица?
    типа
    "FF-A7-0-7-92-F6-75-F6" или
    "FF.A7.0.7.92.F6.75.F6"
    Мой код это правильно обработает (я им как раз IP-шники и выхватываю) а sscanf нада переписывать.
     
    zsm нравится это.
  15. b707

    b707 Гуру

    Код перестанет работать - ну может это и хорошо?
    У ТС появится шанс научится что-то делать самому, а не клянчить в инете - хотя бы шаблон в sscanf с двоеточий на тире переписать :)
    Или думаешь не осилит?
     
  16. А если завтра у него посреди этой строки появятся цитаты из конституции?
     
    b707 и DetSimen нравится это.
  17. DetSimen

    DetSimen Гуру

    Да. В sscanf шаблон поменять проще, чем обьяснять, как работает мой код. Мошт, и прав дядяВитя.
     
  18. DetSimen

    DetSimen Гуру

    Да, ты прав, я уже согласилса.
     
  19. Asper Daffy

    Asper Daffy Гуру

    Это чё щас было? Ты это компилировать пробовал? Точно?