在谷歌云存储项目上工作,我试图计算Crc32c值,并通过crc32c算法获取长值返回的base64编码。要计算crc32c我正在使用
https://github.com/GoogleCloudPlatform/crc32c-java/blob/master/src/com/google/cloud/Crc32c.java
Crc32c crc32c = new Crc32c();
crc32c.update(byteSource.read(), 0, byteArrayLength);
long crcValue = crc32c.getValue();
byte[] bArray = String.valueOf(crcValue).getBytes();
String mEncodedCrc = BaseEncoding.base64().encode(bArray);
// GCSReturnedCrc是Google云存储返回的编码字符串
assertEquals(GCSReturnedCrc, mEncodedCrc);
//结果
java.lang.AssertionError: expected [MjY0MDc0ODQwNQ==] but found [nWafdQ==]`
其他相关链接:https://developers.google.com/storage/docs/hashes-etags#_JSONAPI
最佳答案
您预期的哈希值太长; CRC32C定义为正好4个字节,但是Google Crc32c实现返回一个long。这样做是为了与java.util.zip.Checksum
兼容,并避免将4字节数量放入带符号的int中的带符号性问题。相反,您必须通过以下方式删除前四个前导字节:Arrays.copyOfRange(Longs.toByteArray(crcValue), 4, 8);
我还针对crc32c-java打开了pull请求,这可能会在将来避免此问题:
https://github.com/GoogleCloudPlatform/crc32c-java/pull/2