有效地在脚本中嵌入二进制数据

时间:2014-12-22 11:37:48

标签: python bash binaryfiles

对于类Unix系统,我已经看到了一些安装文件(巨大的,例如Matlab或Mathematica的install.sh),它们必须嵌入了大量的二进制数据,如图标,声音,图形等。 ,进入脚本。我想知道如何做到这一点,因为这可能有助于简化文件结构。

我对使用Python和/或Bash这样做特别感兴趣。

我在Python中了解的现有方法:

  1. 只需使用字节字符串:x = b'\x23\xa3\xef' ...,非常低效,对于100KB的wav文件需要半个MB。
  2. base64,优于选项1,将尺寸放大4/3倍。
  3. 我想知道是否还有其他(更好)的方法可以做到这一点?

2 个答案:

答案 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命令之后执行其他处理(取消归档,设置执行权限等)。只需调整“跳过”中的数字即可反映二进制数据开始前脚本的总长度。