很难比较生成的和google云存储提供的CRC32c校验和

2024-09-28 23:53:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在本地文件上获取CRC32c校验和,以便将其与gcloud库提供的blob.crc32c进行比较。Google说我应该使用crcmod模块来计算数据的CRC32c哈希值。在

modifiedFile.txt已经从Google云存储桶下载到我的本地文件系统。在

这里的目标是,仅当modifiedFile.txt与远程服务器上的CRC32c不同时,should_download设置为true。如果本地文件系统和gcloud Blob都有相同的内容,如何让它们生成匹配的CRC32c?在

from crcmod import PredefinedCrc
from gcloud import storage

# blob is a gcloud Blob object

should_download = True

with open('modifiedFile.txt') as f:
  hasher = PredefinedCrc('crc-32c')
  hasher.update(f.read())
  crc32c = hasher.digest()
  print crc32c # \207\245.\240
  print blob.crc32c # CJKo0A==
  should_download = crc32c != blob.crc32c

不幸的是,它目前总是失败,因为我实际上不知道如何将我用crcmod构建的校验和与我在匹配的Blob对象中看到的属性进行比较。在


Tags: fromimporttxtdownloadgoogle校验blobhasher
2条回答

来自链接的文档:“CRC32c校验和,如RFC 4960附录B所述;以大端字节顺序使用base64编码”

看起来您没有解码base64字符串。

如果您在Windows计算机上,则需要以二进制模式打开文本文件。

下面是gsutil公共tarball的md5和crc32c示例:

$ gsutil ls -L gs://pub/gsutil.tar.gz | grep Hash
    Hash (crc32c):      vHI6Bw==
    Hash (md5):     ph7W3cCoEgMQWvA45Z9y9Q==

我将在本地复制它以使用:

^{pr2}$

CRC值通常显示为无符号32位整数。要转换它:

>>> import base64
>>> import struct
>>> struct.unpack('>I', base64.b64decode('vHI6Bw=='))
(3161602567,)

要从crcmod库获取相同的内容:

>>> file_bytes = open('/tmp/gsutil.tar.gz', 'rb').read()
>>> import crcmod
>>> crc32c = crcmod.predefined.Crc('crc-32c')
>>> crc32c.update(file_bytes)
>>> crc32c.crcValue
3161602567L

如果要将crcmod中的值转换为gcloud/gsutil使用的base64格式:

>>> base64.b64encode(crc32c.digest()).decode('utf-8')
'vHI6Bw=='

相关问题 更多 >