#include #include static unsigned char Data[] = { // uint8_t length; // sizeof(bitmap) + sizeof(data) // uint8_t pad; // uint16_t sjis_code; // big-endian // uint8_t bitmap[36]; // uint8_t data[]; }; static void decode(unsigned char *out, unsigned char *in) { int i; int bmp_index, bmp_bit, tmp_index, data_index; unsigned char *bmp, *data; unsigned char tmp[6]; bmp = in; data = in + 0x24; /* initial state: all zero */ memset(tmp, 0, sizeof(tmp)); data_index = 0; for (i = 0; i < 288; i++) { bmp_index = i / 8; bmp_bit = 7 - (i % 8); tmp_index = i % sizeof(tmp); if (bmp[bmp_index] & (1 << bmp_bit)) { tmp[tmp_index] = data[data_index++]; } if (!((tmp_index + 1) % sizeof(tmp))) { memcpy(out, tmp, sizeof(tmp)); out += sizeof(tmp); } } return; } int main(int argc, char *argv[]) { unsigned char buf[288]; int i; decode(buf, Data + 4); for (i = 0; i < sizeof(buf); i++) printf("%c", buf[i]); return 0; }