Перевод из 16 в 2 систему счисления
У нас есть массив с закодированным в нем двоичным кодом.
byte alphabet[4][7] =
{
{0x4,0xA,0x11,0x11,0x1F,0x11,0x11},
{0x1E,0x11,0x11,0x1E,0x11,0x11,0x1E},
{0xE,0x11,0x10,0x10,0x10,0x11,0xE},
{0x1C,0x12,0x11,0x11,0x11,0x12,0x1C}
};
Тип массива можно изменить, т.к. я растерялся что нужно делать вообще. Код на С++ есть, но на ArduinoIDE он не работает. Вернемся к разбору. Каждый элемент массива представляет собой строку в двоичном коде. Это сделано для экономии памяти.(Возможно я и не прав) Для большего понимания прикрепляю фотографию. Она соответствует первой (Нулевой) строке массива. Желтым обозначается 1. Красным 0. Черным границы, которые не учавствуют в массиве, который описан выше.
Как можно преобразовать элемент массива, чтобы получить строку 1 и 0 для добавления в int массив? К примеру в этот:
int Mask[7][30] = {
{0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,1,0,0,1,1,1,0,0,0},
{0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0,1,0,0,1,0,0},
{1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0},
{1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,0,0,1,0,0,0,1,0},
{1,1,1,1,1,0,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,1,0,0,0,1,0},
{1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,1,0,0},
{1,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,1,0,1,1,1,1,0,0,1,1,1,0,0,0}
};
Ответы (1 шт):
У меня получилось что-то подобное, отступ между буквами есть (LETTER_MARGIN):
#include <iostream>
#include <map>
#define LETTER_WIDTH 5
#define LETTER_HEIGHT 7
#define LETTER_MARGIN 1
int main() {
char alphabet[][LETTER_HEIGHT] = {
{0x04,0x0A,0x11,0x11,0x1F,0x11,0x11}, // A
{0x1E,0x11,0x11,0x1E,0x11,0x11,0x1E}, // B
{0x0E,0x11,0x10,0x10,0x10,0x11,0x0E}, // C
{0x1C,0x12,0x11,0x11,0x11,0x12,0x1C}, // D
{0x11,0x11,0x11,0x13,0x15,0x19,0x11}, // И
{0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // empty
};
std::map<int, int> ma = { {'A', 0}, {'B', 1}, {'C', 2}, {'D', 3}, {'И', 4}, {' ', 5} };
const int mytext[] = {'A', 'B', ' ', 'И', ' ', 'C', 'D'};
int mytextSize = sizeof(mytext) / sizeof(mytext[0]);
int outa[LETTER_HEIGHT][mytextSize * (LETTER_WIDTH + LETTER_MARGIN)];
for (int i = 0; i < mytextSize; ++i) {
int ch = ma[mytext[i]];
int x = i * (LETTER_WIDTH + LETTER_MARGIN);
for (int j = 0; j < LETTER_HEIGHT; ++j) {
char c = alphabet[ch][j];
for (int k = 0; k < LETTER_WIDTH; ++k) {
outa[j][x + LETTER_WIDTH - k - 1] = c & 1;
c >>= 1;
}
}
// right margin
for (int k = 0; k < LETTER_MARGIN; ++k) {
for (int j = 0; j < LETTER_HEIGHT; ++j) {
outa[j][x + LETTER_WIDTH + k] = 0;
}
}
}
// output
for (int j = 0; j < LETTER_HEIGHT; ++j) {
for (int i = 0; i < mytextSize * (LETTER_WIDTH + LETTER_MARGIN); ++i) {
std::cout << outa[j][i] << " ";
}
std::cout << std::endl;
}
}
Выводит:
0 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0
0 1 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0
1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0
1 1 1 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0
1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
1 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 0
Правда, отступ можно брать из буквы, увеличив ширину символа на один, но тогда отступ будет слева.
