質問

ばんという言葉を耳にしたことがあ っhack をまとめて見ることができるとか、Zipファイルを単一のファイルとで有効な少なくとも読みやファイルの両方のフォーマットでも、そのからだで任意のものは、ZIPのまわりフォーマットがない。を目的に、この点は、想定中のデータは任意のバイナリデータguarenteedない紛争をJPGまたはZIP形式の意味を含んでいませんの魔法のzipヘッダ0x04034b50).イラストレーション:

0xFFD8 <- start jpg data end -> 0xFFD9 ... ARBITRARY BINARY DATA ... 0x04034b50 <- start zip file ... EOF

私cattingようになります:

猫"mss_1600.jpg"filea fileb filea fileb filea fileb filea filea fileb filea fileb filea fileb filea fileb filea fileb filea fileb filea fileb filea fileb filea fileb fileb"はnullになります。バイト" "randomzipfile.zip">temp.zip

この作6,318KBファイルです。で ない 開業7-Zip.しかし、猫の一つ少ない"ダブル'(その13filea bの12):

猫"mss_1600.jpg"filea fileb filea fileb filea fileb filea filea fileb filea fileb filea fileb filea fileb filea fileb filea fileb fileb filea fileb filea fileb "nullになります。バイト""randomzipfile.zip"> 温度zip

れ5,996KBファイル 開業7-Zip.

がわかってい任意のバイナリデータを持っていないので魔法のZipファイルのヘッダにスクリューです。私は参照ファイルの ワキター+zip取jpg+データ+zip (保存しているブラウザのうち、画像メモリの使用範囲のサイズはzipの拡張子はお客様にてご用意ください)。

知りたいのはなぜ失敗した場合に13の組み合わせない12.のためのボーナスポイントが加算さんが周辺のこのなかのどこかにあるのですね。

役に立ちましたか?

解決

実際には二つの部分に答えん:)

まず何を言っていzipファイルできない 技術的に するバーベイタムでのファイルです。の中央のディレクトリの記録の値のバイトからのオフセットの現在のディスクをする場合には、一つだけです。zipファイルの現在のファイル).現在テルのすぐ近くは飲食面では貧弱プロセッサーを無視することがWindows'zipのフォルダになりにご利用いただけますの修正値はそれを動作させるためにWindows explorerないうP) Zip APPNOTE に関する情報のためのファイル形式です。基本的にする六角レンチをエディタまたは書きツール)にオフセットの中央ディレクトリに関してのディスクの数値です。データベース検索システムの最初の"中央のファイルのヘッダの署名"六角の504b0102)の値を設定することを相殺するものとする。

今alasな固定7zipもよ7zipうとうファイル形式です。基本的にそれのみを検索最初~4MiBのバイナリ列504b0304,っていることを確認してくださいここを想定しいZipのようなその他のアーカイブのフォーマットこれは明らかになぜ追加ファイルの休憩ものを押し出すのを制限するように修正しました

現在では問題を解決に必要なものは付け加える六角文字列は、jpegなく備わっています。一いということで追加直後のFFD8JPEG SOIヘッダは以下の六角レンチデータFFEF0005504B030400.追加のカスタムブロックご配列が正しいのでjpeg画像のヘッダと同じように無視されます。

他のヒント

7-Zipのソースをダウンロードし、これが発生する原因を突き止めました。

CPP / 7zip / UI / Common / OpenArchive.cppには、次が表示されます。

// Static-SFX (for Linux) can be big.
const UInt64 kMaxCheckStartPosition = 1 << 22;

これは、ファイルの最初の4194304バイトのみがヘッダーを検索することを意味します。そこで見つからない場合、7-Zipはそれを無効なファイルと見なします。

1 << 221 << 23に変更することにより、その制限を2倍にできます。 7-Zipを再構築することでその変更をテストしましたが、動作します。

編集:この問題を回避するには、ソースをダウンロードできます、上記の変更を行い、ビルドします。 VS 2008を使用して構築しました。VSコマンドプロンプトを開き、 extracted-source-location \ CPP \ 7zip \ Bundlesに移動して、「nmake」と入力します。次に、Aloneディレクトリで「7za t nonworking.jpg」を実行すると、「Everything is Ok」が表示されます。

だから、この質問を見つけた他の人のために、ここに物語があります:

はい、Andyは7-Zipがファイルで失敗する理由について文字通り正しいですが、私のバージョンの7-Zipを使用するように人々を正確に取得できないので、私の問題を解決しません。

しかし、tyranidは私に解決策をもたらしました。

  • 最初に、JPGに7バイトのZipを開くように提案する小さなバイト文字列を追加します。ただし、有効なJPGフラグメントからわずかにずれています。FFEF00 07 504B030400である必要があります-長さは2バイトずれていました。
  • これにより、7-Zipは開くことができますが、ファイルを抽出することはできず、静かに失敗します。これは、中央ディレクトリのエントリに、ファイルのエントリを指す内部ポインタ/オフセットがあるためです。その前にたくさんのものを置くので、それらすべてのポインターを修正する必要があります!
  • Windowsに組み込まれたzipサポートでzipを開くには、tyranidが言うように、開始ディスク番号<!> quot;に対する中央ディレクトリの開始の<!> quot;オフセットを修正する必要があります。これは最後の2つを実行するためのPythonスクリプトです。ただし、コピーパスタはすぐに使用できますが、フラグメントではありません

#Now we need to read the file and rewrite all the zip headers.  Fun!
torewrite = open(magicfilename, 'rb')
magicdata = torewrite.read()
torewrite.close()

#Change the Central Repository's Offset
offsetOfCentralRepro = magicdata.find('\x50\x4B\x01\x02') #this is the beginning of the central repo
start = len(magicdata) - 6 #it so happens, that on my files, the point is stored 2 bytes from the end.  so datadatadatdaata OF FS ET !! 00 00 EOF where OFFSET!! is the 4 bytes 00 00 are the last two bytes, then EOF
magicdata = magicdata[:start] + pack('I', offsetOfCentralRepro) + magicdata[start+4:]

#Now change the individual offsets in the central directory files
startOfCentralDirectoryEntry = magicdata.find('\x50\x4B\x01\x02', 0) #find the first central directory entry
startOfFileDirectoryEntry = magicdata.find('\x50\x4B\x03\x04', 10) #find the first file entry (we start at 10 because we have to skip past the first fake entry in the jpg)
while startOfCentralDirectoryEntry > 0:
    #Now I move a magic number of bytes past the entry (really! It's 42!)
    startOfCentralDirectoryEntry = startOfCentralDirectoryEntry + 42

    #get the current offset just to output something to the terminal
    (oldoffset,) = unpack('I', magicdata[startOfCentralDirectoryEntry : startOfCentralDirectoryEntry+4])
    print "Old Offset: ", oldoffset, " New Offset: ", startOfFileDirectoryEntry , " at ", startOfCentralDirectoryEntry
    #now replace it
    magicdata = magicdata[:startOfCentralDirectoryEntry] + pack('I', startOfFileDirectoryEntry) + magicdata[startOfCentralDirectoryEntry+4:]

    #now I move to the next central directory entry, and the next file entry
    startOfCentralDirectoryEntry = magicdata.find('\x50\x4B\x01\x02', startOfCentralDirectoryEntry)
    startOfFileDirectoryEntry = magicdata.find('\x50\x4B\x03\x04', startOfFileDirectoryEntry+1)

#Finally write the rewritten headers' data
towrite = open(magicfilename, 'wb')
towrite.write(magicdata)
towrite.close()

DotNetZip を使用して、ハイブリッドJPG + ZIPファイルを作成できます。 DotNetZipはストリームに保存でき、zipコンテンツの書き込みを開始する前に既存のストリームの元のオフセットを認識するのに十分インテリジェントです。したがって、擬似コードでは、次の方法でJPG + ZIPを取得できます。

 open stream on an existing JPG file for update
 seek to the end of that stream
 open or create a zip file
 call ZipFile.Save to write zip content to the JPG stream
 close

すべてのオフセットが正しく計算されます。同じ手法を使用して、自己解凍アーカイブを作成します。 EXEでストリームを開き、最後までシークして、ZIPコンテンツをそのストリームに書き込むことができます。この方法で行うと、すべてのオフセットが正しく計算されます。

別のこと-別の投稿のコメントの1つについて... ZIPでは、ファイルの最初と に任意のデータを含めることができます。 zip中央ディレクトリがファイルの最後にある必要があることを知っている限り、それは一般的なことですが、要件はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top