首先我用QQ截一張8*8的白色真彩影像(只有三個資料塊,即沒有調色板),
我讀取了png資料的IDAT部分(十六進制)
0:0:0:16:49:44:41:54:8:1d:63:fc:ff:ff:3f:3:36:c0:84:4d:10:24:36:38:25:0:56:d4:3:d:73:63:ca:4b
除了length, 標志碼和CRC校驗,中間資料部分為(十進制,共22byte)
{8,29,99,252,255,255,63,3,54,192,132,77,16,36,54,56,37,0,86,212,3,13}。
怎樣對資料進行解壓縮呢。直接用zlib的uncompress得到的是
https://pan.baidu.com/s/1o8KvXZ8。
圖片中
第一塊是原始資料
第二個是uncompress后的
第三個是compress2 level=1壓縮的
第四個是再次解壓
為什么得到的這么奇怪的結果?
uj5u.com熱心網友回復:
僅供參考:void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
uj5u.com熱心網友回復:
等有時間來繼續研究。順便看看樓上老師的代碼。我是記得壓縮方式不只一個uj5u.com熱心網友回復:
我看到樓主你那邊寫著為什么資料那么奇怪。我當初只是讀取資料的時候也遇到這個問題,我一開始貌似用得是十進制的讀取檔案,后來改成了二進制的模式讀取。接著我就習慣性把資料 &0xFF 這樣就正常了uj5u.com熱心網友回復:
我這里理解錯樓主的意思拉。
我看到360那邊的檔案有講過LZ77 有壓碩訓有沒有壓縮。
uj5u.com熱心網友回復:
有空再研究研究,好像有個位元組要倒著看轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/120779.html
標籤:一般軟件使用
