我需要一个用于C语言的嵌入式系统的紧凑数据结构。给定一个表示ascii代码的字节,函数将返回该字体字符的6字节位图。 ROM中只有几个字符的位图 - 例如,0-9,'。',':'和其他一些。
一种低效的解决方案是使数组的长度等于最高的Ascii值,该值指向存储字符位图的第二个数组中的索引。例如,第一个数组将包含一个字节的128个元素,如果我定义了20个字符的位图,则第二个数组将包含20个6字节的元素。第一个数组中的元素值将映射到第二个数组中的索引,因此ascii值选择第一个数组中的元素,该元素的值用作第二个数组中的索引值以获取6个字节的位图。但这浪费了大约100个字节(在第一个数组中)。
有更好的方法吗? 感谢
编辑:我想我将不得不使用switch语句或类似的东西 - 比如@Brandon Yates的建议,我可能会选择
答案 0 :(得分:1)
只有像
这样的结构数组呢?typedef struct
{
uint8_t asciiCode;
uint8_t bitmap;
} charMapping_t;
然后将其初始化为
const static charMapping_t myMap[20] = {your 20 chars....}
答案 1 :(得分:1)
因此,以下内容不够有效:
struct bitmap {
char byte[6];
};
char charset[] = "0123456789+-*/;.";
/* initialize the glyphs in the same order as charset, use glyph[0] for unknown ascii */
const struct bitmap map[sizeof(charset)+1] = {
{ }, /* unknown glyph */
{ }, /* glyph for 0 */
{ }, /* glyph for 1 */
...
{ }, /* glyph for + */
{ }, /* glyph for - */
...
{ }, /* glyph for . */
};
/* return the appropriate map */
static inline const struct bitmap const * get_bitmap(char ascii) {
char *p = strchr(charset, ascii);
if ( p ) { return &map[(p - charset) + 1]; }
return &map[0];
}
答案 2 :(得分:1)
对于12个字节,如果您有字符n
的图形位图(其中32 <= n <128),则可以存储位n
为1的位掩码。将您的位图存储在一个字节数组中(小心使用结构,因为您可能不必担心元素之间的填充)。
您的代码看起来像这样。 get_bitmap
代码天真而缓慢,但会编译成小的东西。
const unsigned char bitmap_available[12] = {0x1, 0x23, ...};
const unsigned char bitmaps[] = {
0x0, 0xff, 0x0, 0xff, 0x0, 0xff, // first character
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, // second character
...
};
/* Do we have bitmap data available for character c? */
int char_available(char c) {
if (c < 32 || c > 127) return 0;
c -= 32;
return (bitmap_available[c >> 3] >> (c & 7)) & 1;
}
/* Returns pointer to bitmap for character c, or NULL if it's not present. */
const unsigned char *get_bitmap(char c) {
int i, n = 0;
if (!char_available(c)) return 0;
for (i = 32; i < c; i++) {
n += char_available(i);
}
return bitmaps + n * 6;
}
显然我不知道你想要哪些字符,也不知道你的位图,所以我把一些随机数据放在两个数据数组中作为例子。