2014-12-22 57 views
3

對於類Unix系統,我已經看到了一些安裝文件(例如Matlab或Mathematica的大型安裝文件),它們必須嵌入相當多的二進制數據,例如圖標,聲音,圖形等。我想知道如何做到這一點,因爲這可能有助於簡化文件結構。將二進制數據有效嵌入到腳本中

我特別感興趣的是用Python和/或Bash來做這件事。

現有的方法,我知道在Python:

  1. 只需使用一個字節的字符串:x = b'\x23\xa3\xef' ...,非常低效的,需要半個MB爲100KB wav文件。
  2. base64,優於選項1,將尺寸放大4/3倍。

我想知道是否有其他(更好)的方法來做到這一點?

+2

我非常懷疑他們是否將整個有效載荷嵌入到腳本中。 –

+0

我認爲他們可能做到了,通過查看大小,它是幾GB。 – qed

+0

你的介紹讓這個問題「太寬泛」。如果您對將二進制數據集成到腳本文件的有效方法感興趣,請問.. – Korem

回答

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'))) 
+0

不錯,你能舉一個小例子嗎? – qed

1

這是一個快速和骯髒的方式。創建MyInstaller下面的腳本調用:

#!/bin/bash 

dd if="$0" of=payload bs=1 skip=54 

exit 

那麼你的二進制文件附加到腳本,並使其可執行:

cat myBinary >> myInstaller 
chmod +x myInstaller 

當你運行該腳本,它將二進制部分複製到一個新的文件在路徑of=中指定。這可能是一個tar文件或其他任何東西,因此您可以在dd命令之後執行額外的處理(取消存檔,設置執行權限等)。只需在「跳過」中調整數字以反映二進制數據啓動之前腳本的總長度。

+0

經常使用的是一個shell腳本,將tarbal解壓縮到正確的位置並進行一些額外的檢查。 Linux的Java包就是這樣構建的。 – mcoolive

相關問題