その後、再びGZIP構造を引用し、損傷gzip圧縮原則章文書を修復:
破損したgzipファイルを修復し、既知のキーは、次の通常の圧縮パッケージの出発点を見つけることです。情報構造は、図に見ることができる。各パケットは、テールパッチタイプ、使用、および要素3と他の木ハフマン木の数に達したハフマン木の圧縮構造から始まります。GZIPは不良セクタの真ん中を提出した場合、通常の投稿の出発点は、不良セクタ、右に少しだけを見つけるために、位置通常の解凍にシフトしてきた、正しいアーカイブを見つけることが可能です開始。32キロバイトの突起のジョブウィンドウgzipファイルのサイズを圧縮するためによると、トラバースは見つけることが64キロバイトを超えることはありません。迅速なサイクリングは、メモリに素早く見つけましたが、判定方法の明確な誤りが必要することができます。
すべてがクリアされているの最初の兆候の終わりには、(我々は戻って破損した時点からご確認ください)ゼロであるべきということです。ハフマンツリー型は、ハフマン(0×02)、要素数が257から286(両端を含む)の間のCL1の値、要素の数は、CCLの30のCL2要素以下でなければならないしなければならない動的でなければならない一般的でもあります値は、1〜15(両端を含む)の数であってもよいです。
実際には、あなたはまた、ハフマン木が例外のロックを解除するかどうか、そこに何かを参照することができ、または規則の原則によって最後の値が256の値であるが、これらのアルゴリズムは、継続的にチェックし、より厄介、上記のアルゴリズムでなければなりません見つけますいくつかの圧縮ブロックで十分です。
具体的な方法は、GZIP横断するように、ソースコードに変更を加えることです。期限に、だけ素早くコードの一部を変更するために、一般的なエンジニアリングをしませんでした。実質的に改訂のポイント:
まず、被害のポイントを見つけます:
unzip.cでは、
エラー(「無効な圧縮データ-フォーマットに違反」);
この行の前に、現在のバイト位置のデコードを取得します。
第二に、トラバースは、損傷のポイントを見つけます:
1、 inflate.cファイル、変更
if (nl > 286 || nd > 30)
#endif
return 1;
次のように:
if (nl > 286 || nd > 30||nl <257 || nd <1)
#endif
return 1;
2、 inflate.cファイル、int型のinflate_block(e)の関数で
次のコードの前に
bb = b;
bk = k;
コードに参加:
if ((t != 2) || (*e != 0))
return 2;
。3、 inflate.cファイル、int型inflate_block(E)テール関数
IF(T == 0)とIF(T == 1)を直接エラー値2を返すことです。
。4、 inflate.cファイル、関数intのインフレート()、改変
if ((r = inflate_block(&e)) != 0)
return r;
end
次のように:
unsigned t; /* block type */
register ulg b; /* bit buffer */
register unsigned k; /* number of bits in bit buffer */
while (inptr <= insize)
{
unsigned int tptr = inptr;
unsigned int tbk = bk;
unsigned long tbb = bb;
unsigned int twp = wp;
long long tstart = *(long long*)(inbuf + tptr);
if ((r = inflate_block(&e)) != 0)
{
inptr = tptr;
bb = tbb;
bk = tbk;
wp = twp;
b = bb;
k = bk;
NEEDBITS(1)
DUMPBITS(1)
}
else
{
printf("get by www.datahf.net!"); //也可输出tstart,bb,bk 值,转载时请保留版权信息:www.datahf.net张宇
}
}
このステップ4の完了後、エラーの.gzファイルをデバッグしようとすると、当然のことながら、また、ヘッド構造を求める即時損傷の位置を求めるために追加した後のコードに解釈することができます。
通常、時の出力のprintf(「www.datahf.netで入手!」 ) このコード行は、正しい開始位置を発見しました。
開始位置を見つけること、またはgzipファイルヘッダの通常のコピーで構成されてもよいした後、次いで良い見つけるためにビットストリームをスプライスし、解凍することができます。(ビットストリームがバイト整列されていない場合は、すべての可能な変位を行います)。しかし、エラーがあるかもしれない圧縮ファイルの多くもアンパック開くことができステッチした後、主に尾チェックサム間違ったサイズは、実際には、無視することができます。
ステッチは、Linuxの下で良い場合は、CRCエラーは、エラーの後に99%に解凍を引き起こす可能性があるので、直接、「gzipの-d」解凍を使用し、ファイルを削除し、パイプコマンドを置き換えることはできません。