Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在脚本中高效嵌入二进制数据_Python_Bash_Binaryfiles - Fatal编程技术网

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倍 我想知道是否

我见过一些类似Unix系统的安装文件(例如,大型文件,install.sh for Matlab或Mathematica),它们一定在脚本中嵌入了大量二进制数据,如图标、声音、图形等。我想知道如何做到这一点,因为这可能有助于简化文件结构

我对使用Python和/或Bash实现这一点特别感兴趣

我所知道的Python中的现有方法:

  • 只需使用一个字节字符串:
    x=b'\x23\xa3\xef'…
    ,效率极低,一个100KB的wav文件需要半MB
  • base64比选项1更好,将大小放大4/3倍

  • 我想知道是否还有其他(更好的)方法可以做到这一点?

    这里有一个快速而肮脏的方法。创建名为
    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')))