CRC32计算与默认值不匹配

时间:2016-11-08 22:09:14

标签: java groovy crc32

我正在编写一个程序来计算Groovy中的CRC32。出于某种原因,我没有得到预期的价值(就像我使用SELECT * FROM student s LEFT JOIN enrollments e ON s.studentNumber = e.studentNumber LEFT JOIN grades g ON e.studentNumber = g.studentNumber WHERE e.subject = g.subject 实施一样):

java.util.zip

我在哪里犯了错误?我使用以下来源作为指南:

我得到的结果:

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

1 个答案:

答案 0 :(得分:1)

好的,我自己想通了。

1)基础java.util.zip.Crc32 0xFFFFFFF使用0xFFFFFFF。

2)实际上,在通过与return进行异或来给出答案之前,库实际上会翻转位。所以基本上我在shared void insert<R>(DSLContext ctx, Table<R&Record> table, Set<TableField<R&Record, Object>> fields, Set<Object> values){ ctx.insertInto(table).columns(fields).values(values).execute(); } 语句中添加了相同的XOR并得到了正确答案。