2014-12-22 2 views
3

유닉스 계열 시스템 용 설치 파일 (예 : Matlab 또는 Mathematica 용 install.sh)을 보았습니다. 다음과 같이 상당히 많은 바이너리 데이터가 포함되어 있어야합니다. 아이콘, 사운드, 그래픽 등을 스크립트에 저장합니다. 이 방법이 파일 구조를 단순화하는 데 잠재적으로 유용 할 수 있으므로 어떻게 수행 할 수 있을지 궁금합니다.스크립트에 바이너리 데이터를 효율적으로 임베드하기

특히 파이썬 및/또는 배시에서이 작업을 수행하고 싶습니다. 내가 파이썬에서 알고

기존 방법 :

  1. 그냥 바이트 문자열을 사용하십시오 x = b'\x23\xa3\xef' ..., 몹시 비효율적는 100킬로바이트의 WAV 파일에 대한 반 MB 걸립니다.
  2. base64, 옵션 1보다 좋음, 크기를 4/3 배로 확대하십시오.

다른 방법 (더 좋은 방법)이 필요한지 궁금합니다.

+2

나는 전체 페이로드가 스크립트에 포함되어 있는지 의심 스럽다. –

+0

나는 그들이 아마 그 크기를 보았을 때, 그것이 몇 GB라고 생각했다. – qed

+0

소개가이 질문을 "너무 광범위하게"만듭니다. 스크립트 파일에 바이너리 데이터를 통합하는 효율적인 방법에 관심이 있다면 .. – Korem

답변

2

데이터가 맞는 경우 (예 : 압축 된 데이터가 아직없는 경우) base64 + 압축 (예 : bz2 사용)을 사용할 수 있습니다.

>>> import bz2 
>>> bz2.compress(b'\x00' * 100 + b'\x01' * 200).encode('base64').replace('\n', '') 
'QlpoOTFBWSZTWcl9Q1UAAABBBGAAQAAEACAAIZpoM00SrccXckU4UJDJfUNV' 

그리고에 데이터를 쓰기 (스크립트에서) 그것을 사용하는 :

예를 들어, (데이터가 값 0x01로 200 바이트 다음에 100 널 (null) 바이트로 구성 말한다) 데이터를 생성하는 a 파일 :

import bz2 
data = 'QlpoOTFBWSZTWcl9Q1UAAABBBGAAQAAEACAAIZpoM00SrccXckU4UJDJfUNV' 
with open('/tmp/testfile', 'w') as fdesc: 
    fdesc.write(bz2.decompress(data.decode('base64'))) 
+0

니스, 작은 예제를 줄 수 있습니까? – qed

1

다음은 빠르고 간단합니다.

#!/bin/bash 

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

exit 

그런 다음 스크립트에 진을 추가, 그리고 그것을 실행합니다 : 스크립트를 실행하면

cat myBinary >> myInstaller 
chmod +x myInstaller 

, 그것은 새로운 파일로 진 부분을 복사합니다라는 다음 스크립트 MyInstaller 만들기 경로 of=에 지정되어 있습니다. 이것은 tar 파일이거나 다른 것이므로 dd 명령 다음에 추가 처리 (보관 취소, 실행 권한 설정 등)를 수행 할 수 있습니다. 이진 데이터가 시작되기 전에 스크립트의 총 길이를 반영하도록 "건너 뛰기"의 숫자를 조정하십시오.

+0

자주 사용하는 곳은 적절한 장소에서 타르를 압축 해제하고 몇 가지 추가 검사를 수행하는 쉘 스크립트입니다. Linux 용 Java 패키지는 이와 같이 구축되었습니다. – mcoolive

관련 문제