2016-11-08 113 views
0

我正在编写一个程序来计算Groovy中的CRC32。出于某种原因,我不明白(因为如果我用java.util.zip执行相同的)期望值:CRC32计算与默认值不匹配

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 

在哪里我错了吗?我用下面的消息人士的指导:

结果,我得到:

1838399800 - original 
4005013284 - my calculation 

回答

1

好了,想通了这一点自己。

1)作为基地remainderjava.util.zip.Crc32使用0xFFFFFFF。

2)库在通过与0xFFFFFFF异或来给出回答之前实际翻转位。所以基本上,我在return声明中添加了相同的XOR并得到正确答案。