ファイル圧縮形式の判別方法

ファイルの圧縮形式については、1980年代から今まで様々なフォーマットが考案されてきました。それらの中で、現在でも一般的に使われているのは以下の3種類と言えます。

  • ZIP
  • LZH
  • RAR

他に Windows 標準インストーラーで使われている cab 形式や Unix で使われる tar 形式もありますが、ここでは扱わないことにします。

これらのファイルの圧縮形式は普通は拡張子で判断しますが、ファイルの内容を見れば拡張子以外でも判別することは可能です。需要があるかどうかわかりませんが、拡張子が不明の場合の判別方法について説明します。

ZIP ファイル

ZIP 形式は、言うまでもなく現在最も広く使われている圧縮形式です。サンプルの ZIP ファイルをバイナリエディターで見ると、以下の通りになっています。

ZIP ファイルに共通するフォーマットは、最初の2文字が “PK” になっていることです。

LZH ファイル

LZH 形式は日本人が考案した圧縮形式で、1990年代までは日本では事実上の標準圧縮形式でした。セキュリティ上の脆弱性が見つかったことから現在ではあまり使われなくなりましたが、過去の遺産として残っているケースは多いと思います。

LZH ファイルをバイナリエディターで見ると、以下の通りになっています。

LZH ファイルに共通するフォーマットは、4,5文字目が “lh” になっていることです。

RAR ファイル

ZIP 形式と比べて圧縮効率が高く、画像や動画の圧縮で使われることが多いようです。RAR ファイルをバイナリエディターで見ると、以下の通りになっています。

RAR ファイルに共通するフォーマットは、最初の3文字が “Rar” になっていることです。

コード

これらのフォーマットを元に、圧縮形式を判別するコードを VB.Net 形式で作成してみました。

Shared Sub CompressionType_Discrimination(ByVal CompFileName As String, ByRef Compression_Type As Integer)

    '-------------------------------------
    '   圧縮ファイルの形式を判別する
    '
    '     Compression_Type=0 : 判別不能
    '                     =1 : zip
    '                     =2 : lzh
    '                     =3 : rar
    '-------------------------------------

    Dim buffer() As Byte

    Dim fs As New IO.FileStream(CompFileName, IO.FileMode.Open, IO.FileAccess.Read)

    ReDim buffer(4)

    fs.Read(buffer, 0, 5)

    '1,2文字目が PK であれば zip 形式と判断
    '4,5文字目が lh であれば lzh 形式と判断
    '2,3文字目が ar であれば lzh 形式と判断

    If Chr(buffer(0).ToString) = "P" And Chr(buffer(1).ToString) = "K" Then
        Compression_Type = 1
    ElseIf Chr(buffer(3).ToString) = "l" And Chr(buffer(4).ToString) = "h" Then
        Compression_Type = 2
    ElseIf Chr(buffer(1).ToString) = "a" And Chr(buffer(2).ToString) = "r" Then
        Compression_Type = 3
    Else
        Compression_Type = 0
    End If

    fs.Dispose()

End Sub

かつて「フォルダを LZH 形式で圧縮して、拡張子を変えて保存」「保存したファイルを LZH 形式で展開」というプログラムを作っていて、それを改良する際に ZIP 形式に変えることになりました。このため、拡張子によらずに圧縮形式を判別する必要が出てきて、それでこういうコードを作成してみました。

こんな特殊な用途を必要とする人がいるかどうかわかりませんが、もし興味があれば使ってみてください。

テキストエディター

上に載せている画像はテキストエディター「MIFES 10」のバイナリモードです。

MS-DOS のころからプログラミングをやっている人間にとって、テキストエディターといえばやはり MIFES なんですよね。Windows になってからも MIFES 5 → MIFES 7 と使ってきて、今は MIFES 10 を使っています。

フリーソフトとして使えるテキストエディターもたくさんあるというのに、1万円以上もする MIFES を買うのは無駄と思うかもしれません。しかしテキストエディターに関しては慣れたものを使うと効率が格段に上がります。MS-DOS 時代に MIFES を使っていた人は、この機会に復帰してみてはいかがでしょうか。