Python 在脚本中高效嵌入二进制数据
我见过一些类似Unix系统的安装文件(例如,大型文件,install.sh for Matlab或Mathematica),它们一定在脚本中嵌入了大量二进制数据,如图标、声音、图形等。我想知道如何做到这一点,因为这可能有助于简化文件结构 我对使用Python和/或Bash实现这一点特别感兴趣 我所知道的Python中的现有方法:Python 在脚本中高效嵌入二进制数据,python,bash,binaryfiles,Python,Bash,Binaryfiles,我见过一些类似Unix系统的安装文件(例如,大型文件,install.sh for Matlab或Mathematica),它们一定在脚本中嵌入了大量二进制数据,如图标、声音、图形等。我想知道如何做到这一点,因为这可能有助于简化文件结构 我对使用Python和/或Bash实现这一点特别感兴趣 我所知道的Python中的现有方法: 只需使用一个字节字符串:x=b'\x23\xa3\xef'…,效率极低,一个100KB的wav文件需要半MB base64比选项1更好,将大小放大4/3倍 我想知道是否
x=b'\x23\xa3\xef'…
,效率极低,一个100KB的wav文件需要半MB我想知道是否还有其他(更好的)方法可以做到这一点?这里有一个快速而肮脏的方法。创建名为
MyInstaller
的以下脚本:
#!/bin/bash
dd if="$0" of=payload bs=1 skip=54
exit
然后将二进制文件附加到脚本中,并使其可执行:
cat myBinary >> myInstaller
chmod +x myInstaller
运行脚本时,它会将二进制部分复制到路径
of=
中指定的新文件中。这可能是一个tar文件或其他文件,因此您可以在dd命令之后执行其他处理(取消归档、设置执行权限等)。只需调整“跳过”中的数字,以反映二进制数据开始之前脚本的总长度。如果适合您的数据(例如,如果您没有嵌入已压缩的数据),您可以使用base64+压缩(例如使用)
例如,要创建数据(假设您的数据由100个空字节和200个值为0x01的字节组成):
并使用它(在脚本中)将数据写入文件:
import bz2
data = 'QlpoOTFBWSZTWcl9Q1UAAABBBGAAQAAEACAAIZpoM00SrccXckU4UJDJfUNV'
with open('/tmp/testfile', 'w') as fdesc:
fdesc.write(bz2.decompress(data.decode('base64')))
我非常怀疑他们是否将整个负载嵌入到脚本中。我认为他们可能嵌入了,从大小来看,它是几GB。你的介绍让这个问题“太宽泛了”。如果您对将二进制数据集成到脚本文件中的有效方法感兴趣,请询问..这可能有助于某些语言,例如Bash,允许将任意二进制数据附加到脚本末尾。经常使用的方法是使用shell脚本在正确的位置解压tarbal,并进行一些附加检查。Linux的Java包就是这样构建的。很好,你能举个小例子吗?这个答案在Python3中不起作用,Python3中不存在
bytes.encode
和str.decode
方法(它们的类型与文本编码的工作方式相反)。您可以导入base64
并使用base64.b64解码(数据)
而不是data.decode('base64')
,并且在创建字符串时类似地使用base64.b64encode
。
import bz2
data = 'QlpoOTFBWSZTWcl9Q1UAAABBBGAAQAAEACAAIZpoM00SrccXckU4UJDJfUNV'
with open('/tmp/testfile', 'w') as fdesc:
fdesc.write(bz2.decompress(data.decode('base64')))