【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

CRC-32

Excelから無圧縮ZIPを出力できると便利そうなので、取っ掛かりとしてVBACRC-32を実装してみました。CRC-32の計算方法はid:n7shi:20100905を参照してください。

Option Explicit

Dim Crc32Table&(255)

Private Sub InitCrc32Table()
    Dim I%, J%, R&, R1&
    For I = 0 To 255
        R = I
        For J = 0 To 7
            R1 = R And 1
            R = (R - R1) / 2
            If R < 0 Then R = R - &H80000000
            If R1 Then R = R Xor &HEDB88320
        Next J
        Crc32Table(I) = R
    Next I
End Sub

Public Function GetCrc32&(A$)
    Dim R&, I%, B As Byte
    If Crc32Table(255) = 0 Then InitCrc32Table
    R = Not 0
    For I = 1 To Len(A)
        B = Asc(Mid(A, I, 1))
        R = (Int(R / 256) And &HFFFFFF) Xor Crc32Table((R Xor B) And &HFF)
    Next I
    GetCrc32 = Not R
End Function

Public Function GetCrc32FromFile&(Path$)
    Dim R&, I&, B As Byte, FL&
    If Crc32Table(255) = 0 Then InitCrc32Table
    FL = FileLen(Path)
    Open Path For Binary Lock Read As #2
    R = Not 0
    For I = 1 To FL
        Get #2, , B
        R = (Int(R / 256) And &HFFFFFF) Xor Crc32Table((R Xor B) And &HFF)
    Next I
    Close #2
    GetCrc32FromFile = Not R
End Function