[an error occurred while processing this directive]
|
Ниже - текст упаковщика.
#include unsigned char buf[256000]; unsigned char res[256000]; unsigned char msk[256000]; // Возвращает число одинаковых символов после того, на который указывает указатель n ++; return n; void Pack(int treshold) for (int i = 0; i < blen;) int sl = SerLen(i); if ((buf[i] == 0) && (sl > treshold)) i += 1 + sl; mbit ++; // Контрольная распаковка void Unpack(void) tptr = 0; for (int pd = 0, bd = 0, mbit = 0; pd < rlen;) if (msk[bd] & (1 << mbit)) UnpackedByte(0); mbit ++; void main (int argc, char **argv) // Загружаю в буфер blen = 0; printf ("%d bytes loaded\n", blen); // Пакую printf ("Total altera data length %d bytes\n", rlen + mlen + 1); // Сохраняю результат fprintf (outp, "// Упакованная прошивка Альтеры подготовлена из файла\n"); fprintf (outp, "#define PDLENGTH %d\n", rlen); // fprintf (outp, "const unsigned int packed_data_length = PDLENGTH;\n"); fprintf (outp, "const unsigned char flash packed_data[PDLENGTH] =\n{"); for (int i = 0, n = 8; i < rlen; i ++) fprintf(outp, "0x%02X", res[i]); if (i < rlen-1) n ++; fprintf (outp, "const unsigned char flash zero_burst_bits[%d] =\n{", mlen+1); for (i = 0, n = 8; i < mlen+1; i ++) fprintf(outp, "0x%02X", msk[i]); if (i < mlen) n ++; fclose (outp); // Тестовая распаковка
E-mail:
info@telesys.ru
int blen = 0;
int rlen = 0;
int mlen = 0;
int mbit = 0;
int SerLen(int from)
{
for (int i = from+1, n = 0; i < blen; i ++)
{
if (buf[i] != buf[from])
{
break;
}
}
}
{
rlen = 0;
mlen = 0;
msk[mlen] = 0;
mbit = 0;
{
if (mbit > 7)
{
msk[++ mlen] = 0;
mbit = 0;
}
// Серия не длиннее байта
if (sl > 255)
{
sl = 255;
}
{
// Серия нулей
res[rlen++] = sl;
msk[mlen] |= 1 << mbit;
}
else
{
// Все остальное без сжатия
res[rlen++] = buf[i ++];
}
}
}
int tptr;
void UnpackedByte(unsigned char b)
{
if (buf[tptr++] != b)
{
printf("compare error in %d\n", tptr - 1);
}
}
{
unsigned char n;
{
if (mbit > 7)
{
bd ++;
mbit = 0;
}
{
n = res[pd++];
while(n --)
{
UnpackedByte(0);
}
}
else
{
UnpackedByte(res[pd++]);
}
}
}
{
if (argc < 2)
{
printf("RBF file needed\n");
return;
}
printf ("Open file '%s'\n", argv[1]);
FILE * inp = fopen(argv[1], "rb");
if (!inp)
{
printf ("Open file error\n");
}
while (!feof(inp))
{
buf[blen++] = fgetc(inp);
}
fclose(inp);
Pack(1);
FILE * outp = fopen ("altera_data.c", "wt");
fprintf (outp, "// %s\n\n", argv[1]);
{
if (n == 8)
{
fprintf(outp, "\n\t");
n = 0;
}
{
fprintf(outp, ", ");
}
}
fprintf (outp, "\n};\n");
{
if (n == 8)
{
fprintf(outp, "\n\t");
n = 0;
}
{
fprintf(outp, ", ");
}
}
fprintf (outp, "\n};\n\n");
printf ("Check\n");
Unpack();
}
Ответы