0

我需要一个用于 C 中的嵌入式系统的紧凑数据结构。给定一个表示 ascii 代码的字节,一个函数将为该字体的字符返回一个 6 字节的位图。只有少数字符的位图会在 ROM 中 - 例如,0-9、'.'、':' 和其他一些字符。

一种低效的解决方案是使用长度等于最高 Ascii 值的数组,该数组指向存储字符位图的第二个数组中的索引。例如,第一个数组将有 128 个一个字节的元素,如果我定义了 20 个字符的位图,第二个数组将有 20 个 6 个字节的元素。第一个数组中的元素值将映射到第二个数组中的索引,因此 ascii 值选择第一个数组中的元素,并且该元素的值用作第二个数组中的索引值以获取 6 字节位图。但这浪费了大约 100 个字节(在第一个数组中)。

有没有更好的办法?谢谢

编辑:我想我将不得不使用 switch 语句或类似的语句 - 例如@Brandon Yates 的建议,我可能会挑剔

4

3 回答 3

1

像这样的结构数组呢

typedef struct
{
    uint8_t asciiCode;
    uint8_t bitmap;
} charMapping_t;

然后像这样初始化它

const static charMapping_t myMap[20] = {your 20 chars....}
于 2013-05-12T15:07:17.080 回答
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];
}
于 2013-05-12T15:25:12.113 回答
1

n对于 12 个字节,如果您有字符的图形位图n(其中 32 <= n < 128) ,则可以在位为 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;
}

显然我不知道你想要哪些字符,也没有你的位图,所以我在两个数据数组中放了一些随机数据作为例子。

于 2013-05-12T15:56:05.770 回答