2016-11-08 3 views
0

Я пишу программу для вычисления CRC32 в Groovy. По какой-то причине я не получаю ожидаемое значение (то же самое, как если бы я использовал 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

Ok, понял это сам.

1) В качестве основы remainderjava.util.zip.Crc32 использует 0xFFFFFFF.

2) Библиотека фактически переворачивает биты, прежде чем давать ответ XORing с помощью 0xFFFFFFF. Поэтому в основном я добавил тот же XOR в оператор return и получил правильный ответ.