Help! Programare in C

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
4,821
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. :tongue:
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Messages
4,821
Multumesc. Incerc sa descifrez in weekend, ca saptamana asta a fost turbare la serviciu.
 
Top Bottom