在谷歌云存储项目上工作,我试图计算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

09-11 04:50