Help! Programare in C

Marius '95

troubleShooter
Am nevoie de un pic de ajutor in descifrarea unei imagini comprimate.
Sirul de mai jos, dupa decomprimare ar trebui sa fie o imagine 128x128 alb-negru (1bit/pixel), deci 128x128=16384 pixeli a cate 1 bit, /8 biti = 2048 Bytes.
Eu am scris functia mea proprie in PHP, dar dintr-un motiv care imi scapa, marimea rezultatului variaza de la caz la caz in loc sa fie fix 2 KB.

Asadar, se da urmatorul sir ca exemplu:
Code:
Z4f;21;Z2;1;Zb;4;Z3e;10;Z30;8;1;Z2f;1;Z19;4;Z5;1;Z1f;1;Z27;80;40;Z11;80;Z4;1;Z19;40;Z5;1;Zf;1;Z6;20;Z2;1;20;Z14;1;Z14;2;Z3;8;Z6;1;Z8;80;Zd;20;Zf;4;Z8;1;Zf;1;Z9;80;0;2;Z9;1;0;80;10;Z6;1;Zc;20;0;80;Z9;4;0;8;Z3;10;Zd;8;Z10;4;Zf;c;0;1;Z4;10;Z8;3;
;c8;Z7;4;Z4;10;40;10;0;1;Z4;2;Z8;94;Z6;2;Z2;1;Z2;8;20;Z2;80;81;Z4;4;Z7;80;12;0;81;Z4;2;Z4;1;Z2;40;34;80;1;Z7;22;Z3;21;23;41;cc;Z8;4;Z3;90;84;62;88;1;Za;40;a;3;21;0;1;Z6;80;Z4;9;4;15;40;Z8;40;Z2;c;22;f2;3f;18;2;Z4;2;Z4;8;b;ab;d6;32;dc;Z7;2;80;
;0;2;10;26;68;2c;24;Z6;22;Z4;1;95;5a;32;82;1;Z6;8;a0;0;2;21;1d;e5;b8;65;Z6;8;Z2;10;18;8d;8e;fe;58;a8;41;Za;1d;69;U1;8e;c0;80;Z5;20;Z4;f;fd;U1;de;c4;Za;10;2f;7f;af;U1;b0;Za;83;9d;ef;fe;ca;90;Z5;20;1;Z3;e;2f;df;7f;f6;40;1;Z3;8;20;0;10;Z2;a;7f;f7;
;U1;ef;a0;Z6;10;Z2;20;26;fa;U2;bf;10;1;Z3;20;Z5;3;U1;df;U1;dd;e0;Z5;4;Z3;1;76;f9;U2;ef;88;Z4;2;Z5;1e;b7;U2;fd;Z6;5;20;0;1;0;53;7f;fe;U1;d5;8;Z5;1;8;Z2;40;49;U3;f5;6a;Za;3f;U3;e4;90;Z5;80;Z4;6f;U3;fc;70;Z6;c;Z2;4;5f;U3;fb;28;Z4;1;4;Z4;7b;U3;ed;
;Z6;40;Z4;a7;U3;db;80;Z5;10;Z3;1;2b;U2;f6;dd;80;Z4;13;0;2;Z2;b;77;U2;ef;a8;Z5;22;Z2;10;2;d;7b;U2;f9;b4;80;Z4;1;0;12;40;8;11;bf;U2;bf;28;Z5;80;80;3;0;80;c4;7f;U2;fd;c0;Z4;30;40;Z2;1;2;49;7f;U3;a2;Z4;1;Z4;1;27;7f;fd;U1;f7;Z5;a;81;20;29;0;2;b;7f;
;U1;df;bf;98;Z7;80;0;10;a9;6f;U2;8a;Z5;3;0;40;Z2;80;5f;7f;U2;b0;Z5;2;0;4;0;14;40;86;U2;f6;e8;80;Z5;10;Z2;2;0;56;7f;fd;d9;60;Z8;16;8;6;82;f7;fe;be;88;Z5;4;10;4;0;55;2;4f;fd;U1;26;Z6;8;e0;0;83;4;10;15;U1;d6;fc;36;Z5;9;98;0;8;a8;10;2e;b1;5f;fc;4;
;0;2;Z3;4;40;0;1;62;40;c9;9c;69;50;0;8;Z4;8;41;84;Z2;40;11;f6;d9;0;10;Z5;4;Z3;26;0;39;ad;9a;2;50;Z2;80;Z3;8c;1;82;4;0;40;6;b7;80;1;Z5;2;40;0;18;1;e9;0;41;10;0;24;60;0;1;Z2;1;18;1;65;20;8;0;16;10;Z2;41;0;40;Z3;20;c;79;90;Z2;91;8;50;9c;a;80;Z3;42;
;12;0;40;0;40;5;1;80;40;84;0;48;4;Z2;20;0;5;8;45;a0;2;10;81;6;d0;85;40;Z4;4;80;38;62;Z3;89;ad;41;85;20;20;Z2;14;5;79;42;d0;50;10;1;e0;31;da;90;Z6;b6;2c;12;0;80;8;89;5f;38;50;Z4;4;10;14;20;60;Z2;9b;16;e7;3e;20;Z4;8c;1;10;44;5;48;0;e6;aa;bf;d1;
;28;2;20;Z2;20;0;3;1;0;1b;22;9;8f;e3;a;80;Z4;1;0;a5;14;8;8b;98;9f;f8;U1;29;Z5;10;0;20;8a;d3;f2;19;1e;fa;fb;32;1;Z4;20;1;2;7f;fb;bc;5;7d;d6;U1;f0;4;Z4;4;4a;6;5b;ef;f7;75;7b;f3;b3;30;Z5;a;9;48;U3;8f;f2;9f;1b;2;10;Z4;1;88;1f;U3;21;7f;a9;50;80;Z5;52;
;27;3f;U3;e5;79;ed;a0;40;Z5;5;41;3b;U3;f6;78;84;18;c0;Z6;1;7f;U3;c0;f4;5;0;20;80;Z5;28;f;U2;fa;bf;60;80;10;Z6;52;21;1f;U2;fe;40;48;14;Z7;4;2;f;U2;7e;48;Z9;10;2;7f;U1;fc;f9;0;c0;Z8;26;50;7b;U1;db;0;40;Z9;1;b0;2d;bf;d2;Zd;87;d3;48;Zd;b;0;40;Zd;8;
;Z4b;T

Si se da functia:
Code:
Example of compatible decompression function (Language C): 
 
int UnSqueezeMatrix(unsigned char *pucDestMatrix, unsigned char *pucSrcM)  // dest, src 
{ 
int iCnt; 
unsigned char *pucDest, *pucSrc, ucVal; 
pucSrc  = pucSrcM;    // source 
pucDest = pucDestMatrix;   // dest 
memset(pucDestMatrix, 0, sizeof(BMP_MATRIX));    // maz dest 
while (*pucSrc != 'T')    // end of trame 
    { 
    ucVal = *pucSrc; 
    switch(ucVal) 
        { 
        case '\x0d':  // ignore CR , LF , separator 
        case '\x0a': 
        case ';': 
            break; 
        case 'U':     // value 0xFF 
            { 
            pucSrc++; 
            sscanf((char *)pucSrc,"%x", &iCnt); 
            memset(pucDest, 0xFF, iCnt); 
            pucDest+= iCnt; 
            break; 
            } 
        case 'Z':     // value 0 
            { 
            pucSrc++; 
            sscanf((char *)pucSrc,"%x", &iCnt); 
            memset(pucDest, 0x00, iCnt); 
            pucDest+= iCnt; 
            break; 
            } 
        default: 
            { 
            sscanf((char *)pucSrc,"%x", &iCnt); 
            *pucDest++ = (u_char)iCnt; 
            break; 
            } 
        } 
    while (*pucSrc != ';')         // skip ; separator 
        pucSrc++;
    pucSrc++; 
    } 
return((int)pucDest - (int)pucDestMatrix); 
} 
 
This function needs that ";" is considered as a delimiter by the function scanf(), which is normally done in 
most of the systems.

Si se dau si explicatiile:
Principle of the compression algorithm :
• The repetition of the byte 00 are coded "Zxxx", xxx = counter in ASCII Hexadecimal.
• The repetition of the byte FF are coded "Uxxx", xxx = counter in ASCII Hexadecimal.
• The other bytes are formatted in ASCII Hexadecimal: "xx".
• The end of the scattergram finshes with the character "T".
• Each item is separed by a delimiter ";".
• Before to reach 250 characters, a return [CR] is inserted.

Poate cineva sa imi dea rezultatul functiei aleia sa il compar cu ce obtin eu?
Multumesc. Dau bere celui care decodeaza sirul si trece si prin Braila. :P
 
Back
Top