将文件分成块

2024-05-08 22:23:13 发布

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

正在为一个我正在攻读的密码学自学课程做作业(这门课我没有得到学分)。我需要在一个大文件上计算散列值,其中散列是逐块进行的。我现在遇到的难题是如何将文件分成这些块?我正在使用python,这是我非常陌生的。在

f = open('myfile', 'rb')
BLOCK_SIZE = 1024
m = Crypto.Hash.SHA256.new()
thisHash = ""
blocks = os.path.getsize('myfile') / BLOCK_SIZE #ignore partial last block for now

for i in Range(blocks):
    b = f.read(BLOCK_SIZE)
    thisHash = m.update(b.encode())
    f.seek(block_size, os.SEEK_CUR) 

我正确地处理这个问题吗?在m.update(b.encode())行执行之前,代码似乎一直在运行。我不知道我是不是太离谱了,也不知道该怎么做才能让它成功。如有任何建议,我们将不胜感激。谢谢!在

(注意:正如您可能注意到的,这段代码目前并没有真正产生任何东西——我只是在搭建一些脚手架)


Tags: 文件代码forsizeosupdateblockmyfile
2条回答

为了使这个示例正确工作,您必须做一些事情。以下是一些要点:

  • Crypto.Hash.SHA256.SHA256Hash.update()(作为m.update()调用)没有返回值。要从对象中提取一个人类可读的哈希值,.update()多次,然后调用.hexdigest()
  • 在将二进制数据输入.update()函数之前,不需要对二进制数据进行编码。只需传递包含数据块的字符串。在
  • 文件指针由file.read()高级。您不需要单独的.seek()操作。在
  • .read()将返回一个空字符串,如果您已经命中EOF。这很好。随便拉一下那部分。在
  • 变量名区分大小写。block_sizeBLOCK_SIZE不是同一个变量。在

做这些小小的调整,假设你有所有正确的进口,你就会走上正轨。在

另一种解决方案是先将文件分成块,然后逐块执行哈希

这将把文件分成1024字节的块

with open(file,'rb') as f:
    while True:
        chunk = f.read(1024)
        if chunk:
            fList.append(chunk)
        else:
            numBlocks = len(fList)
            break

Note: last block size may be less than 1024 bytes

现在你可以做任何你想做的杂凑。在

相关问题 更多 >

    热门问题