Преобразовать байтовый текстовый файл в массив
Я пытаюсь отобразить растровое изображение на 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[]
с разделением на ",
".
@Saleh al hage, 👍0
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);
. Использование текста в качестве промежуточного формата одновременно расточительно и неоправданно увеличивает сложность.
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- ЖКИ питается больше необходимого тока
- ЖК-дисплей с I2C не распознается esp32
- Нет функции сопоставления для вызова 'DS3231 (const uint8_t &, const uint8_t &)
- qMenuSystem Oled I2C не может заставить его работать
- Как полностью очистить все от arduino и напечатать что-то новое?
- Что не так с моим жидкокристаллическим дисплеем и кодом клавиатуры?
- Как запрограммировать кнопку джойстика, чтобы сбросить все?