2016-11-08 4 views
0

Ich schreibe ein Programm, um CRC32 in Groovy zu berechnen. Aus irgendeinem Grund kann ich nicht mit den erwarteten Wert (das gleiche wie wenn ich java.util.zip Implementierung verwendet):CRC32 Berechnung stimmt nicht überein Standard

def crc32(byte[] bytes) { 
    return new java.util.zip.CRC32().with { update bytes; value } 
} 

def myCrc32(byte[] bytes) { 
    def remainder = 0x0 
    def multiple = 0 
    def poly = 0xEDB88320 

    bytes.each { b -> 
     remainder ^= b 
     for (int i = 0; i < 8; i++) { 
      multiple = (remainder & 1) ? poly : 0; 
      remainder = (remainder >> 1)^multiple; 
     } 
    } 
    return remainder 
} 


def origFile = 'file' 
def fileBytes = new File(origFile).text.getBytes() 
def origRes = crc32(fileBytes) 
def myRes = myCrc32(fileBytes) 

println origRes 
println myRes 

Wo tat ich einen Fehler? Ich habe die folgenden Quellen als Leitfaden:

Ergebnisse, die ich bekomme:

1838399800 - original 
4005013284 - my calculation 

Antwort

1

Ok, dachte ich dies.

1) Als Basis remainderjava.util.zip.Crc32 verwendet 0xFFFFFFF.

2) Bibliothek dreht Bits tatsächlich um, bevor eine Antwort durch XORing mit 0xFFFFFFF gegeben wird. Also habe ich im Grunde das gleiche XOR zu der return Anweisung hinzugefügt und richtige Antwort bekommen.

Verwandte Themen