2013-05-10 4 views
1

바이너리 파일 (C로 생성)을 가지고 있는데 파일 내부를보고 싶습니다. 분명히, 나는 바이너리로서 유용한 것을 "볼"수 없을 것이다. 그러나 나는 두 배 정밀도로 숫자가있는 특정 수의 행을 포함하고 있음을 알고 있습니다. 나는 스크립트가 올바른 값을 가지고 있는지를 검증 할 수 있도록 일부 값을 읽고 프린트하는 스크립트를 찾고있다. 즉, 텍스트 파일에 linux에서 head 또는 tail을 수행하는 것과 같습니다. 방법이 있습니까? 는 지금은 파이썬에서 무언가를 가지고 있지만, 내가하고 싶은 일을하지 않습니다이진 파일을 ASCII로 해석하기

CHUNKSIZE = 8192 
file = open('eigenvalues.bin', 'rb') 
data = list(file.read()) 
print data 

답변

3

사용 array module을 (시험, 그러나 이것은 올바른 믿지) :

from array import array 

data = array('d') 
CHUNKSIZE = 8192 
rowcount = CHUNKSIZE/data.itemsize # number of doubles we find in CHUNKSIZE bytes 

with open('eigenvalues.bin', 'rb') as eg: 
    data.fromfile(eg, rowcount) 

array.array 유형은 그렇지 않은 단지 목록처럼 작동, 보유 할 수있는 값의 유형 만이 제한됩니다 (이 경우 float).

입력 데이터에 따라 작은 쪽과 큰 쪽 사이를 전환하기 위해 읽은 후 data.byteswap() 호출을 추가해야 할 수도 있습니다. sys.byteorder을 사용하여 데이터를 읽는 데 사용 된 바이트 순서를 확인하십시오. 당신이 쉘 명령에 서명 진수로 표현되는 파일의 각 바이트를 볼 수 있습니다

import sys 

if sys.byteorder == 'big': 
    # data was written in little-endian form, so swap the bytes to match 
    data.byteswap() 
+0

니스 -이 기능을 인식하지 못했습니다. 감사. – Seidr

+0

@Seidr :'array'는 한 가지 유형의 C 표준 바이너리 데이터 시퀀스를 처리하는 경우'struct'에 대한 훌륭한 무료 모듈입니다. –

3

당신은 특정 데이터 타입으로 바이너리 데이터를 변환 struct.unpack를 사용할 수 있습니다.

예를 들어, 이진 데이터에서 첫 번째 double을 읽으려는 경우. 균일 한 이진 표현 번호를 읽을

struct.unpack("d",inputData[0:7]) 

http://docs.python.org/2/library/struct.html

3

: 데이터는 플랫폼이 다른 형태를 사용하고, 그 반대의 경우 리틀 엔디안, 스왑을 사용하여 플랫폼에 기록 된 경우 :

dd status=noxfer if=eigenvalues.bin bs=1 skip=800 count=16 | od -F 
:

od -t u1 eigenvalues.bin | less 

당신이 특정 지역을보고 싶어하고 부동 소수점 숫자를 디코딩 할 경우, 당신은, 예를 디코딩하는 그들과 od -F 옵션을 추출하는 dd을 사용할 수 있습니다

은 바이너리 파일의 오프셋 800과 808에 저장된 두 배의 정밀도 숫자를 표시합니다.

질문에 대한 Linux 태그에 따르면, 사용자가 ddod의 Gnu 버전을 사용하고 있다고 가정합니다.

+0

@ jilliagre 매우 참으로 유용합니다! 감사! – Manolete

관련 문제