Преобразовать байтовый текстовый файл в массив

Я пытаюсь отобразить растровое изображение на gLCD 128x64, я сохранил растровое изображение в txt-файл 1.txt в SD - карте это часть битовой карты следующим образом:

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

Я хочу преобразовать содержимое этого текста в массив: Unsigned char logo[] с разделением на ",".

, 👍0


1 ответ


1

Самый эффективный способ-читать файл байт за байтом в небольшой массив символов до тех пор, пока вы не получите запятую или конец файла, игнорируя любые символы, которые не представляют интереса (каналы строк и т. Д.).

Затем для каждого прочитанного фрагмента вы преобразуете его в целое число.

Например (непроверено):

char temp[5] = {0}; // should be more than enough
int pos = 0;
int bno = 0;

const char *hexchars = "0123456789abcdefABCDEFx";

while ((int ch = myFile.read()) >= 0) {
    if (ch == ',') { // Мы нашли запятую
        logo[bno++] = strtoul(temp, NULL, 16); // Преобразование базы 16
        pos = 0;
        temp[0] = 0;
    } else if (strchr(hexchars, ch) != NULL) {
        if (pos < 4) {
            temp[pos++] = ch;
            temp[pos] = 0;
        }
    }
}

Конечно, вы должны заранее знать, насколько большим должен быть массив логотипов.

Однако нужно спросить: "Почему вы храните графический логотип как текстовое представление двоичных данных" в первую очередь? Было бы гораздо проще просто сохранить его в виде простого двоичного файла и прочитать данные непосредственно в массив логотипа с помощью одного вызова функции File::read(void *buf, size_t nbyte);. Использование текста в качестве промежуточного формата одновременно расточительно и неоправданно увеличивает сложность.

,