idl로 바이너리파일을 읽고 쓸때

게시판 IDL Q&A idl로 바이너리파일을 읽고 쓸때

6 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #1328 Reply
      kimkb
      회원

      idl로 바이너리 파일를 읽어서 포트란에서 다시 읽어서 쓸려고 합니다.

      unix에서 사용합니다.

      어떤 자료가 바이너리로 주워져서 그걸 idl로 제 컴퓨터에 맞게 읽어드려서
      똑같이 포트란에서 읽고 계산할려고 하는데 잘되질 않네요?
      방법을 좀 알려주세요.

      if keyword_set(kfile) then begin
      if keyword_set(lun) eq 0 then lun=1
      if keyword_set(swap) then swap = 1 else swap = 0
      openr,lun,kfile,/f77_unformatted,swap_endian=swap
      nread=0

      읽을땐 이렇게 읽어 드리고

      openw,lun+2,kfile2

      이 파일을 만들어서 여기다가 저장합니다.

      (openw에 적을때 /f77_unformatted 를 주고 읽으면 전혀 안읽힙니다. 대신 이전 원본 바이너리와
      똑같은 파일이 만들어지고 용량크기도 같습니다.)

      (하지만 /f77_unformatted를 빼고 읽어드리면 어느정도 읽히는데.. 용량도 원본파일과 다르게 되더라구요)

      그래서 idl로 아스키 파일로 바꾸고 그걸 포트란에서 바이너리로 바꿔서 읽는데..

      뭔가 이상한것같아서 잘 안맞는것 같에요 용량도 원본 파일과 다릅니다.

      방법을 좀 알려주세요 ㅠ

    • #1334 Reply
      Jonghyuk
      회원

      말씀하신 상황이 잘 이해가 되지 않는데요,
      Fortran으로 처리하는 것이 최종 단계라면 그냥 존재하는 파일을 Fortran에서 읽으면 되는 것 아닌지요?

      “(openw에 적을때 /f77_unformatted 를 주고 읽으면 전혀 안읽힙니다. 대신 이전 원본 바이너리와
      똑같은 파일이 만들어지고 용량크기도 같습니다.)”

      이런 말씀도 있는데, openw는 파일을 Writing할 때 사용하며 읽는 것과는 무관합니다.

    • #1335 Reply
      kimkb
      회원

      제가 이해하기 어렵게 말씀드린것같습니다.
      최종으로 처리해야 하는 건 포트란이고 바이너리 파일도 포트란에서 읽고 쓰는 용으로 되어있습니다.
      하지만 다른 사람이 제공한 바이너리 파일이 포트란에서는 읽히지 않습니다.( 바이너리 같은 경우에는 컴퓨터(?)마다 다를 수 있어서 다른사람이 쓰고 읽었던 파일을 제가 쓰지 못하는 경우가 있다고합니다. )
      그래서 방법을 찾아보니 idl로는 바이너리 파일을 읽고 쓸 수 있다고 하여서 그렇게 할려고 하는 중에 문제가 생겨서 질문을 하는 거에요.

      openw /f77_unformatted 로 바이너리로 만들 파일을 열고 printeu ? 이건가요 이렇게 바이너리로 저장해서 읽으면 안되다는 의미로 말씀드린거에요~.

    • #1336 Reply
      Jonghyuk
      회원

      1) A 파일이 가지고 계신 Fortran 프로그램에서 읽히지 않는데, IDL에서는 읽을 수 있었다.
      2) 그래서 IDL로 A 파일을 A’ 파일로 변환하여, 가지고 계신 Fortran 프로그램으로 A’ 파일을 읽게 하고자 한다.

      이 정도로 이해하면 되는 상황인 것 같습니다.

      F77_UNFORMATTED 옵션을 사용하여 IDL에서 읽었을 때 잘 읽혔다면, A 파일은 F77 Binary가 맞는 것 같습니다. F77 Binary는 일반 Binary에 비하여 파일 크기가 조금 큽니다. 왜냐하면 레코드 마다 앞 뒤로, “이 레코드의 크기는 몇 바이트임” 하는 숫자와 “이 레코드에 몇 바이트를 기록하였음”을 의미하는 숫자가 더 씌여집니다. 문제가 없다면 이 두 숫자는 당연히 같은 값이어야 하고, 아마도 고전적인 데이터 처리에서 체크섬 같은 것으로 활용했던 것 아닌가 추측합니다. 어쨌든 가지고 계신 A 파일은 F77 Binary가 맞을 것 같습니다. A’이 파일 크기가 더 작다면 이는 당연할 수 있습니다.

      가지고 계신 Fortran 프로그램이 A 파일을 못 읽었다면 두 가지 문제를 생각해 볼 수 있습니다.
      1) Fortran 프로그램이 데이터를 읽는 방식이 F77 Binary가 아닌 일반적인 Binary를 읽도록 되어 있을 경우
      2) Byte Order(Little Endian과 Big Endian)가 달라서 이상한 값으로 읽게 되는 경우
      입니다. 물론 1), 2)의 조합으로 발생하는 문제일 수도 있습니다만…

      Fortran이라고 하더라도 요즘 Fortran은 F77 Binary가 아닌 형식을 지원합니다(인텔 Fortran은 디폴트가 일반 Binary라고 알고 있습니다. F77 Binary는 사양세 거든요).

      지금 제가 생각해 볼 수 있는 것은,
      OpenW 로 IDL에서 file을 쓸 때(A’ 파일을 만들 때), F77_Unformatted 키워드는 사용하지 마시고, Swap_endian=0 또는 Swap_endian=1 이렇게 두 가지를 시도해 보시면, 둘 중 하나가 되지 않을까 기대해 보는데요, 바이너리라는 것이 띄어쓰기 같은 구분자가 없으므로, 읽고 쓰는 게 하나만 틀려도 이상하게 밀리게 됩니다. Fortran 프로그램 소스코드 보시면서 이 부분도 잘 맞춰 보시는 것이 좋겠습니다.

    • #1346 Reply
      kimkb
      회원

      답변주셔서 감사합니다 ^^ 설연휴 잘 보내셨는지오. 저도 연휴가 끝나고 와서 가르쳐 주신 대로 해보았습니다.
      첫번째로 emdl 이라는 제가 읽을 수 없었던 원본 바이너리 파일입니다. 파일의 용량을 적어드리면.

      emdl = 174368
      1file = 174360 (swap_endian=0 을 주고 만든 바이너리 파일)
      2file = 174360 (swap_endian=1 을 주고 만든 바이너리 파일)
      3file = 174368 (/f77_unformatted 을 주고 마든 바이너리 파일)
      4file = 174360 (아무것도 주지 않고 만든 파일)

      제가 가진 fortran package 안에서는 emdl 파일의 형식을 읽는 실행파일이 존재합니다.

      그래서 이 파일들을 읽어 보았는데 2,3번 파일은 처음부터 읽지를 못합니다.

      1, 4 번 파일은 읽기는 읽는데 상수값이 원본 파일과는 다르게 나옵니다.

      (idl로 읽는 파일이 있습니다.>> 제가 1 2 3 4 번을 만들 수 있게 해주는 코드인데요 거이서 swap, /f77 등을 바꾸고 바이너리 포트란 파일은 읽은 그것 입니다. 거기에서 읽고 바꿀 때 모니터에 상수들을 프린터 해주는데요 1 , 4 번 파일을 읽어 들이면 읽기는 읽고 끝까지 잘 읽지만 못하지만.. 하지만 상수를 잘못 프린터하네요. 즉 잘 못읽는것 같습니다.)

      그래서 제가 idl로 읽어서 프린터 할 때 바이너리가 아닌 asc 파일로 파일을 만들고 그걸 다시 포트란으로 읽어서 바이너리로 바꾸면 적어도 상수까지는 어느정도 잘 읽습니다. 문제는 이것도 끝까지는 잘 읽지 못하지만요..)

      지금 이러한 상황에 있습니다.

      해결할 기미가 보이질 않네요.

      바이너리 읽는 순서는 어차피 package에서 제공해주기 때문에 제가 건드릴 필요는 없을 것 같구요.

      어려움에 처해 있네요.

      어렵게 가르쳐 주셨는데 해결을 못해서 너무 죄송하네요..

    • #1353 Reply
      Jonghyuk
      회원

      어렵네요. 바이너리 파일이라는 것이 저장된 규칙을 정확히 알고, 읽는 쪽에서 이 규칙을 그대로 적용하여 읽으면 기본적으로 쉽게 읽히는 것인데, 1byte라도 삐끗하면 이상한 값들이 연속되거든요.

      1번과 4번은 사실상 같은 파일이 되었을 것으로 보입니다.

      IDL로 잘 읽힌다는 것은 emdl 파일에는 문제가 없는 것으로 보이고(저장 규칙대로 저장이 되어 있다는 것으로 추측할 수 있습니다), emdl을 Fortran 실행파일(소스코드가 없는 상황인 것 같습니다)이 못읽는다면, Fortran 실행파일이 파일을 읽는 규칙이 틀렸다는 얘기가 됩니다.

      지금 하시는 일은 emdl을 규칙을 잘못 적용한 Fortran 프로그램이 읽을 수 있도록 맞춰 주려는 것이구요. 그런데 잘못 작성된 Fortran 프로그램을 실행파일 형태로 가지고 계실 것 같지는 않고, Fortran 프로그램에 대해 변호를 해 주는 것이 쉽지 않습니다. Byte Swap 과 관련된 문제라면 실행 파일이 아예 돌아가지 않아야 할 것 같습니다(예를 들면 Linux에서 Solaris 운영체제 실행 파일을 돌릴 수 없기 때문이죠).

      Fortran 소스코드를 한번 찾아 보시는 게 좋지 않을까요?

    • #1354 Reply
      kimkb
      회원

      포트란 소스코드를 찾는다는 것이 제가 말씀 드린 포트란 실행 파일을 만드는 코드를 말씀하시는 건가요?

      요기에 제가 읽고 쓰는 프로그램을 올리고싶은데 어떻게 올리는지 몰라서 보여드리진 못하네요..

6 답변 글타래를 보이고 있습니다
'idl로 바이너리파일을 읽고 쓸때'에 답변달기
글쓴이 정보: