对于类Unix系统,我已经看到了一些安装文件(巨大的,例如Matlab或Mathematica的install.sh),它们必须嵌入了大量的二进制数据,如图标,声音,图形等。 ,进入脚本。我想知道如何做到这一点,因为这可能有助于简化文件结构。
我对使用Python和/或Bash这样做特别感兴趣。
我在Python中了解的现有方法:
x = b'\x23\xa3\xef' ...
,非常低效,对于100KB的wav文件需要半个MB。我想知道是否还有其他(更好)的方法可以做到这一点?
答案 0 :(得分:2)
您可以使用base64 +压缩(例如,使用bz2),如果这适合您的数据(例如,如果您没有嵌入已经压缩的数据)。
例如,要创建数据(假设您的数据包含100个空字节,后跟200个字节,值为0x01):
>>> import bz2
>>> bz2.compress(b'\x00' * 100 + b'\x01' * 200).encode('base64').replace('\n', '')
'QlpoOTFBWSZTWcl9Q1UAAABBBGAAQAAEACAAIZpoM00SrccXckU4UJDJfUNV'
并使用它(在您的脚本中)将数据写入文件:
import bz2
data = 'QlpoOTFBWSZTWcl9Q1UAAABBBGAAQAAEACAAIZpoM00SrccXckU4UJDJfUNV'
with open('/tmp/testfile', 'w') as fdesc:
fdesc.write(bz2.decompress(data.decode('base64')))
答案 1 :(得分:1)
这是一种快速而肮脏的方式。创建以下名为MyInstaller
的脚本:
#!/bin/bash
dd if="$0" of=payload bs=1 skip=54
exit
然后将二进制文件追加到脚本中,并使其可执行:
cat myBinary >> myInstaller
chmod +x myInstaller
运行脚本时,它会将二进制部分复制到路径of=
中指定的新文件。这可能是tar文件或其他任何内容,因此您可以在dd命令之后执行其他处理(取消归档,设置执行权限等)。只需调整“跳过”中的数字即可反映二进制数据开始前脚本的总长度。