Binary Data 읽기

게시판 IDL Q&A Binary Data 읽기

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #2876 Reply
      chobo
      회원

      안녕하세요~
      Binary Data를 읽으려고 합니다.
      배열은 960*1200이고, 자료구조는 1byte이며, 는 -128 ~ 127의 범위의 값을 가지고 있습니다.
      그래서,

      bin1 = bytarr(960, 1200)
      openr, lun, filename, /get_lun
      readu, lun, bin1
      close, lun
      했는데, bin1은 0 ~ 255의 값을 가지게 되었습니다.

      fbin1 = fix(bin, type = 2)
      fbin1도 역시 0 ~ 255 범위로서, 기대하는 결과가 아니었습니다.

      혹시나 해서, read_binary를 이용해보았습니다.
      bin2 = bytarr(960, 1200)
      bin2 = read_binary(filename, data_type=1, data_dims = [960, 1200])
      이 방법으로 해도, bin2의 값이 0 ~ 255 범위를 갖게 되어습니다. (원래 값인 -128 ~ 127의 범위)

      어떻게 하면, bin1, bin2를 원래 값인 -128 ~ 127의 범위로 읽을 수 있을까요?
      매번 감사합니다.

    • #2879 Reply
      mwkim
      회원

      안녕하세요,

      혹시 읽은 데이터에 128을 빼면 어떨까요?

      물론 이렇게 하기 위해서는 자료형을 바이트형에서 정수형으로 바꾸셔야 합니다.

      bin2 = FIX(bin1) – 128

      제가 알기로는 대부분의 프로그램 언어에서 바이트는 0~255까지로 알고있습니다.

      원하시는 것처럼 -128에서 127까지라면 offset(여기서는 -128)을 별도로 명시하지 않았을까 추측합니다.

    • #2880 Reply
      chobo
      회원

      답변 감사드립니다.
      128을 빼도 원하는 결과는 아닙니다.
      혹시 IDL에서 1byte character는 어떻게 읽을수 있나요?

      • #2881 Reply
        mwkim
        회원

        1byte character가 바이트를 문자로 바꾸는 것을 의미하나요?

        바이트 문자 변환은 ascii 코드에 따라 변환되는 것으로 알고있습니다.

        다만 ascii 변환은 127까지 되고 그 이상(extended ascii)은 변환이 되지는 않는 것 같습니다.

        그리고 변환 과정을 물어보신 거면 STRING 함수를 이용하면 간단히 변환됩니다.

        아래는 예제 입니다.

        x = BINDEN(10) + 100B ; 0~9는 출력문자가 아니여서 범위를 100~109로 조정했습니다.
        y = STRING(x)
        HELP, y

      • #2883 Reply
        chobo
        회원

        안녕하세요. 제가 데이터 포맷에 대한 기본이 없어서, 질문을 여러번 드리게 됩니다.
        감사합니다.
        mwkim님께서 말씀하신 대로 해보니깐,
        아래처럼 나오게 됩니다.
        제가 예상했던것은 a[0]이 b[0] 즉 character로 전환하는 것을 예상했었는데 예상치 못한 결과과 나왔습니다.
        읽고자 하는 자료는 -128 ~ 127의 값을 캐릭터 형태인 1-byte character로 저장을 했다고 합니다. 해서, 1byte-character를 IDL에서 어떻게 읽는지 궁금합니다.
        ㅜㅜ

        —–
        IDL> a = bindgen(10)+100B
        IDL> help, a
        A BYTE = Array[10]
        IDL> print, a
        100 101 102 103 104 105 106 107 108 109
        IDL> b = string(a)
        IDL> help, b
        B STRING = ‘defghijklm’
        IDL> print, b
        defghijklm
        IDL>

    • #2882 Reply
      Sangwoo
      회원

      올려주신 코드에서 filename이라고 되어 있는 파일이 담고 있는 배열 내의 데이터 값 자체가 바이트(Byte)형 값이라면, 그 자료형의 특성상 0~255의 범위를 가질 수 밖에 없습니다. 바이트라는 자료형의 특성상 0~255의 범위를 벗어나는 값은 가질 수가 없습니다. 그 파일을 제가 직접 다뤄본 적이 없어서 100% 확정적으로 말씀드리지는 못하겠지만, -128~127의 범위라는 의미는 아마도 0~255인 바이트형 값으로 읽은 후 일괄적으로 128을 마이너스해서 사용하란 의미인 것으로 보입니다.

      • #2884 Reply
        chobo
        회원

        안녕하세요.
        제가 읽고자 하는 filename 파일은
        단순히 -128 ~ 127의 캐릭터를 1-byte로 저장을 한것입니다.
        IDL에서 1 byte-character를 IDL에서 어떻게 읽으면 되는지요?
        (128을 빼서(-) 하는 것은 아닌것으로 확인 되었습니다.) ㅜㅜ

      • #2886 Reply
        Sangwoo
        회원

        눈으로는 바이트형 값처럼 보이지만 실체는 문자형인 데이터라는 의미인가요? 그렇다면 아예 문자형(String)으로 읽어야 하지 않을까요? 그러면 data라는 배열에 대한 사전 선언을 하지 않고 그냥 바로 다음의 내용과 같은 방법으로 읽어보면 어떨까요?

        data = read_binary(filename, data_type=7, data_dims = [960, 1200])

      • #2887 Reply
        chobo
        회원

        data_type=7으로 설정하면, 아래와 같은 에러코드가 나옵니다.

        ————

        rdr = READ_BINARY(file_list[‘rdrFP’]+file_list[‘rdrFN’], data_type=7, data_dims=[960, 1200])
        rdr = float(rdr)
        help, rdr
        prnit, rdr[0,0]

        % READ_BINARY: Reading strings via READ_BINARY is not supported. (Specify an array of bytes instead.)
        % Execution halted at: RDRBINREADING 233 D:\700_Analysis\710_LinetEvaluation\codes\ltn_radar_far_v1p04.pro
        % LTN_RADAR_FAR_V1P04 397 D:\700_Analysis\710_LinetEvaluation\codes\ltn_radar_far_v1p04.pro
        % $MAIN$
        IDL>

        rdr = READ_BINARY(file_list[‘rdrFP’]+file_list[‘rdrFN’], data_type=7) ;, data_dims=[960, 1200])
        rdr = float(rdr)
        help, rdr
        prnit, rdr[0,0]

        % READ_BINARY: Reading strings via READ_BINARY is not supported. (Specify an array of bytes instead.)
        % Execution halted at: RDRBINREADING 233 D:\700_Analysis\710_LinetEvaluation\codes\ltn_radar_far_v1p04.pro
        % LTN_RADAR_FAR_V1P04 397 D:\700_Analysis\710_LinetEvaluation\codes\ltn_radar_far_v1p04.pro
        % $MAIN$
        IDL>

        배열을 설정하고, data_type=7으로 설정하면, 아래와 같은 에러코드가 나오네요.. ㅜㅜ

        ————

        rdr = strarr(960,1200)
        rdr = READ_BINARY(file_list[‘rdrFP’]+file_list[‘rdrFN’], data_type=7, data_dims=[960, 1200])
        rdr = float(rdr)
        help, rdr
        prnit, rdr[0,0]

        % READ_BINARY: Reading strings via READ_BINARY is not supported. (Specify an array of bytes instead.)
        % Execution halted at: RDRBINREADING 233 D:\700_Analysis\710_LinetEvaluation\codes\ltn_radar_far_v1p04.pro
        % LTN_RADAR_FAR_V1P04 398 D:\700_Analysis\710_LinetEvaluation\codes\ltn_radar_far_v1p04.pro
        % $MAIN$
        IDL>

        • 이 답변은 chobo에 의해 7 years, 9 months 전에 수정됐습니다.
    • #2889 Reply
      Sangwoo
      회원

      올려주신 내용들로 봐서는 레이더 관측자료인 것으로 보이는데, 혹시 데이터 내 값들의 해석과 관련하여 참조할만한 내용이 있을까요? 관련 웹페이지나 readme 파일과 같이 파일 내 값들의 해독 방법에 관한 자료가 있는지 궁금합니다.

4 답변 글타래를 보이고 있습니다
'Binary Data 읽기'에 답변달기
글쓴이 정보: