使用ascii值传递查找6字节结构的C数据结构

时间:2013-05-12 15:00:45

标签: c arrays data-structures ascii lookup-tables

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

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

有更好的方法吗? 感谢

编辑:我想我将不得不使用switch语句或类似的东西 - 比如@Brandon Yates的建议,我可能会选择

3 个答案:

答案 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;
}

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