2015-01-02 1 views
2

필자는 Julia를 시작하려고 노력 중이며 Python으로 작성한 작은 프로그램을 다시 작성하기로 결정했습니다. 실행 시간이 너무 오래 걸렸습니다.Julia에서 특정 바이트 크기 (32 비트) 값을 가진 이진 파일을 읽는 방법?

필자가 작성한 일부 바이너리 데이터를 읽는 방법에 대한 첫 번째 충돌이있었습니다.

6 개의 Float32 숫자의 "행"에 탭 이진 데이터로 작성된 파일이 있습니다 (gziped라고 생각합니다).

6 행을 한 행씩 읽는 방법을 찾았지만 읽는 방법을 모르겠다. (읽은 상태에서 EOF를 사용하는 방법은?) 나는 또한 파일을 읽는 것이 더 좋을 것이라고 생각한다. 매번 6 개의 값 대신에 바로 나타납니다.

using GZip 
dataFile = GZip.open("ACE_ions_fieldrotation.bin.gz", "r") 
read(dataFile, Float32, 6) 
# tried also this but it doesn't work, besides not allowing me to specify that I'm reading Float32 numbers: 
# readuntil(dataFile, eof) 
# it fails with the error: `read` has no method matching read(::GZipStream, ::Type{Function}) 
close(dataFile) 

이 작업을 수행하려면 어떻게해야합니까? 어떤 아이디어?

편집 :

이이 도움이 경우 16 진 덤프를 사용하여 GZIP 파일의 첫 번째 128 바이트입니다.

0000000 1f 8b 08 08 0b 87 a1 54 02 ff 41 43 45 5f 69 6f 
0000010 6e 73 5f 66 69 65 6c 64 72 6f 74 61 74 69 6f 6e 
0000020 2e 62 69 6e 00 7c bd 75 58 97 dd d2 3d ae 22 25 
0000030 dd dd dd dd 21 31 84 48 29 88 d8 18 28 16 22 62 
0000040 8b 81 88 1d 80 85 8a 2d 06 28 26 d8 8d 22 26 60 
0000050 2b d8 20 76 b7 f2 f5 3c bf df 79 df eb bc b3 f6 
0000060 79 fe 7b c6 7d cd bd ef bd 67 af 59 b3 f6 dc 1f 
0000070 da c4 87 46 ac bc 61 4a 23 e6 6a 53 9b bf ff c9 
0000080 
+1

여기에 사람들이 실험 할 수 있도록 질문을 편집하고 파일 내용 샘플을 추가해주십시오. – Jubobs

+1

"작동하지 않는다"는 대신 오류 메시지 등을 게시하는 것이 좋습니다. – tholy

+0

@Jubobs 좋겠지 만 명령 줄에 GZipped 이진 파일을 좋은 방법으로 표현하는 방법을 모르겠습니다. 도움이 필요한 경우 질문에 대한 hexdump로 찍은 파일의 첫 번째 128 바이트. – jbssm

답변

1

답변을 찾았으니 나중에 참조 할 수 있도록 게시 해 드리겠습니다.

우리는 readbytes 함수를 사용해야하며 바이트를 읽기가 매우 쉽습니다. reshapetranspose을 사용한 후에 (reshapetranspose을 수행하지 않고 바로 정확하게 입력하도록하는 방법) 올바른 크기의 배열을 얻습니다.

using GZip 
simDataFile = GZip.open("ACE_ions_fieldrotation.bin.gz", "r") 
simData = reinterpret(Float32,readbytes(simDataFile)) 
close(simDataFile) 
simArray = transpose(reshape(simData, 6, div(length(simData),6))) 
1

당신을 위해

x = readuntil(dataFile, '\n') 
y = reinterpret(Float32, x.data[1:end-1]) 

사용할 수 있습니까?

+0

@tholy 글쎄, 시작이야. 그것은 어느 정도까지 작동합니다. 그것은 내가 얻고 자하는 올바른 형식으로 파일의 일부 (덜 1 %)가되었습니다. 아마도 '\ n'은 올바른 이스케이프 문자가 아닐까요? – jbssm