首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较apk文件md5值存在的md5时发生错误

比较apk文件md5值存在的md5时发生错误
EN

Stack Overflow用户
提问于 2016-11-06 12:40:43
回答 2查看 149关注 0票数 0

导入hashlib库(md5方法是其中的一部分)

代码语言:javascript
复制
import hashlib    

要检查的文件

代码语言:javascript
复制
file_name = "test.apk"      

正确的原始md5在这里

代码语言:javascript
复制
original_md5 = '5d41402abc4b2a76b9719d911017c592'  

打开、关闭、读取文件并计算其内容的MD5

代码语言:javascript
复制
with open(file_name) as file_to_check:
    # read contents of the file
    data = file_to_check.read()
    md5_returned = hashlib.md5(data).hexdigest()

最后,将原始MD5与新计算结果进行比较。

代码语言:javascript
复制
if original_md5 == md5_returned:
    print ("MD5 verified.")
else:
    print ("MD5 verification failed!.")

错误

代码语言:javascript
复制
File "newhash.py", line 15, in <module>
    data = file_to_check.read()
File "C:\Users\AppData\Local\Programs\Python\Python35-32\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8f in position 286: character maps to <undefined>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-06 13:10:47

要计算校验和(md5、sha1等),必须以二进制模式打开文件,因为您将对字节值进行求和:

要使py27/py3可移植,您应该使用io包,如下所示:

代码语言:javascript
复制
import hashlib
import io


def md5sum(src):
    md5 = hashlib.md5()
    with io.open(src, mode="rb") as fd:
        content = fd.read()
        md5.update(content)
    return md5

如果您的文件很大,您可能更喜欢按块读取该文件,以避免将整个文件内容存储在内存中:

代码语言:javascript
复制
def md5sum(src, length=io.DEFAULT_BUFFER_SIZE):
    md5 = hashlib.md5()
    with io.open(src, mode="rb") as fd:
        for chunk in iter(lambda: fd.read(length), b''):
            md5.update(chunk)
    return md5

如果您的文件是真正的大文件,您可能还需要显示进度信息。为此,您可以调用一个回调函数,该函数打印或记录计算的字节数:

代码语言:javascript
复制
def md5sum(src, callback, length=io.DEFAULT_BUFFER_SIZE):
    calculated = 0
    md5 = hashlib.md5()
    with io.open(src, mode="rb") as fd:
        for chunk in iter(lambda: fd.read(length), b''):
            md5.update(chunk)
            calculated += len(chunk)
            callback(calculated)
    return md5
票数 0
EN

Stack Overflow用户

发布于 2016-11-06 12:51:56

问题是,您将该文件作为文本文件而不是二进制文件读取。不知道是使用python2还是python3,但在这两种情况下,您都可以找到如何从文件中读取字节,而不是将它们解释为字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40449442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档