Python 3中如何为exiftool提取的二进制JPG计算SHA512校验和?
如何为Exiftool提取的二进制JPG计算SHA512校验和?
其实你有两种可行的方案,其中纯Python内处理的方式更简洁,还不用依赖额外的系统命令,算是更优的选择,我先给你详细说这个:
方案一:纯Python计算SHA512(推荐)
你可以直接用Python标准库中的hashlib来处理提取到的二进制数据,不用把数据写到临时文件或者管道给外部命令。修改你的函数就行:
import subprocess import hashlib def getVisSig(filename): """ Calculates visual signature using imagemagick package. returns signature """ print("Calculating VisSig on %s" % filename) # 启动exiftool提取二进制预览图 result = subprocess.Popen(["exiftool","-b","-PreviewImage", filename,], stdout=subprocess.PIPE) # 获取输出的二进制数据 binary_data, _ = result.communicate() # 计算SHA512校验和 sha512_hash = hashlib.sha512() sha512_hash.update(binary_data) # 返回十六进制格式的校验和 return sha512_hash.hexdigest()
这里的关键是用communicate()获取subprocess输出的二进制内容,然后直接喂给hashlib的SHA512对象。这种方式完全在Python环境内完成,跨平台性更好,也避免了管道可能带来的额外开销。
方案二:通过命令行管道传输到sha512sum
如果你还是想用一开始考虑的管道方式,也可以实现,直接在subprocess里构造管道命令就行:
import subprocess def getVisSig(filename): """ Calculates visual signature using imagemagick package. returns signature """ print("Calculating VisSig on %s" % filename) # 构造管道:exiftool输出直接传给sha512sum exif_proc = subprocess.Popen(["exiftool","-b","-PreviewImage", filename], stdout=subprocess.PIPE) sha_proc = subprocess.Popen(["sha512sum"], stdin=exif_proc.stdout, stdout=subprocess.PIPE) # 关闭exif_proc的stdout,让它收到SIGPIPE当sha_proc结束时 exif_proc.stdout.close() # 获取sha512sum的输出 output, _ = sha_proc.communicate() # 输出格式是"校验和 -",所以取前面的部分 return output.decode('utf-8').split()[0]
不过这种方式依赖系统上安装了sha512sum命令(Windows上可能没有,需要额外配置),所以通用性不如纯Python的方案。
内容的提问来源于stack exchange,提问作者ensnare
相关产品推荐
相关产品推荐

