C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[36962] Re:Re:Re:Re:바이너리 파일 좀 읽어주세요.
bigdream [bigdream] 1308 읽음    2004-08-24 16:11
답변 정말 감사드립니다.
죄송한데 자료형식이 아래와 같이 되어 있다고 합니다.
그러면 이 자료는 어떻게 읽어야 하나요?
구조체로 해서 읽는 방식이 따로 읽는건가요?
이런게 여러줄 있으면 어떻게 읽어야하나요? 한꺼번에 읽어서 처리해주면 되는건가요?


*자료 파일 레코드 구조

    Dreal file (DLssvvv.dat : 시간)
    Record Size (32 item) ⇒ 80 Byte

    Record position                Description
                        Format

    1, 2                    Year (4 digits) : 2byte integer
    3                    Month  :  1byte integer
    4                    Day    :  1byte integer
    5                    Hour(0-23) :  1byte integer
    6                    Minutes    :  1byte integer

    7                    Item 1-4   missing data flag pack data
    8                    Item 5-8   missing data flag pack data
    9                    Item 9-12  missing data flag pack data
    10                    Item 13-16 missing data flag pack data
    11                    Item 17-20 missing data flag pack data
    12                    Item 21-24 missing data flag pack data
    13                    Item 25-28 missing data flag pack data
    14                    Item 29-32 missing data flag pack data

    15, 16                    Item 1  data : 2byte integer
    17, 18                    Item 2  data : 2byte integer
    19, 20                    Item 3  data : 2byte integer
    21, 22                    Item 4  data : 2byte integer
    23, 24                    Item 5  data : 2byte integer
    .                        .
    .                        .
    .                        .
    73, 74                    Item 30 data : 2byte integer
    75, 76                    Item 31 data : 2byte integer
    77, 78                    Item 32 data : 2byte integer
    79, 80                    unused


    (1) 1 Byte integer :
        An integer number 1 byte in length with a value from 0 to 255

    (2) 2 Byte integer :
        An integer number 2 byte in length with a value from -32768 to +32768
        To calculate the actual density value of an item, the item value is divided
        by 10 raised to the power of the decimal point location value given in the
        DCT.
        For example, if the item value is 500 and the decimal point location value
        is 2 the resulting item value would be 5.0(500/10 power of 2=5.0)

    (3) pack data :
        The status of each item at any particular interval is recorded in a 2 bit area.
        Each pack data field is 1 byte in length and contains the value for item 1,
        bits 2 & 3 contain the value for item 2, etc

    2 bit area                Description
    00                    Normal data  (정상)
    01                    Missing data due to maintenance (조정중)
    10                    Missing data due poor movement (동작불량)
    11                    Missing data due to power down (전원 단절)

    pack data byte                B7,B6
                        B5,B4
                        B3,B2
                        B1,B0
    item 1-4  position  7            4
                        3
                        2
                        1
    item 5-8  position  8            8
                        7
                        6
                        5
    item 9-12  position  9            12
                        11
                        10
                        9
    item 13-16  position 10            16
                        15
                        14
                        13


    item 17-20  position  11        20
                        19
                        18
                        17
    item 21-24  position  12        24
                        23
                        22
                        21
    item 25-28  position  13        28
                        27
                        26
                        25
    item 29-32  position  14        32
                        31
                        30
                        29




smleelms 님이 쓰신 글 :
: 일단 파일을 읽는 함수는 여러가지가 있습니다. 그중에 편한것을 사용하시면 될거구요..
: 예를 든다면...
:
:     byte buff[1024];
:     TFileStream *infs;
:     try
:     {
:         try
:         {
:             infs = new TFileStream("c:\\dl05005.dat", fmOpenRead);
:             infs->Seek(0, soFromBeginning);
:             infs->ReadBuffer(buff, sizeof(buff));    // 파일사이즈만큼 또는 블럭사이만큼이 되겠지요
:         }
:         catch(const Exception& e)
:         {
:             Application->MessageBox(e.Message.c_str(), "File Open/Read Error", MB_OK|MB_ICONERROR);
:         }
:
:     }
:     __finally
:     {
:         delete infs;
:     }
:
:
: 그런데 실제로 올려주신 파일을 위의 예제처럼 buff에 읽어들인다고 하더라도...
: 저넘들을 어떻게 해석해야 되는지는 파일저장시 했던 과정의 역으로 해석이 되어야 한다는 겁니다.
:
: 즉.. 올려주신 내용이 11122120040820235000000.~~~
: 이렇게 되더라도.. 저내용이 그냥 integer 데이터인지.. float 데이터인지.. 아니면
: struct {
:     int aaa;
:     float bbb;
:     char ccc;
: }
: 처럼 저장된 데이터인지 알 수가 없다는겁니다. 올려주신 데이터를 보면 숫자(물론 그냥 char일수도 있습니다.)뿐 아니라 dot에 알파벳까지 있으니 더 알수가 없지요.
:
: 그리고 또 다른 측면에서 보면 지금 제시해주신 원본 데이터가 다른 프로그램에서 읽어들인것을 보여주신것 같은데요..
: 그렇다면 cnt 파일과 dat 파일이 서로 연관되어 있다고 볼 수도 있습니다.
: ( .cnt 파일은 가장 많이 사용되기로는 "Windows 또는 기타 시스템, 도움말 색인 등의 목적으로 사용되는 콘텐츠 파일"이라고 소개되기도 하네요..)
:
: 그렇다면 더더욱 저장할때의 포맷을 알아야만이 제대로 읽어들일 수가 있겠지요.
:
:
: 30억 님이 쓰신 글 :
: : 답변감사드립니다.
: : 지금 파일을 읽으면 원본 데이터가
: : 11122120040820235000000.002P00007.0U000.001P000.040P0000.40P00000.0P000.055P000.015P0000.01P00000.0P0000013D00001.6M00023.8C1000.0021017.0001000.0021000.0431000.411000100020001001700010000##
: : 이런식으로 죽 나열되어 있는 데이터 입니다. 그런데 제가 이 바이너리 파일을 만든게 아니라 다른데에서 만든 파일을 제 프로그램에서 읽어들여서 아스키로 바꿔주고 싶거든요.
: : 그런데 제가 초보라 바이너리 파일을 읽는 방법을 잘 모르겠습니다.
: : 읽어도 이상한 값으로만 깨지고. 어떻게 해야 읽을수 있을까요? 그냥 읽으면 된다고는 하는데 그 방식을 몰라서 .... 부탁드립니다.
: :
: : smleelms 님이 쓰신 글 :
: : : 음.. 바이너리 파일 2개를 첨부하셨는데요..
: : : 바이너리로 읽는 방식이 중요한게 아니라, 이 바어너리 데이터가 어떤 포맷으로 저장된, 무엇을 의미하는 데이터인가가 중요하다고 하겠지요..
: : :
: : : 실제로 올려주신 바이너리 데이터를 메모리에 읽어들여도 그데이터들을 어떤 데이터 형태로 저장(대입)하느냐에 (ex : char, float, int , struct...) 따라서 다를테니까요..
: : :
: : : 무엇보다도 올려주신 바이너리 파일이 어떠한 형태로 저장이 된것인지를 아셔야, 읽어들여도 디코딩이 되겠죠.
: : :
: : : 물론 아신다면 질문에 그 부분에 대한 언급이 있었겠지만, 바이너리 파일 2개 올리시고 읽을 수 없냐고 하시길래 노파심에 적어봅니다. (제가 잘 몰라서 그럴수도 있습니다.. 양해해 주시길.. ^^;)
: : :
: : : 그럼.. 부디 원하시는바를 이루시길...
: : :
: : :
: : : 30억 님이 쓰신 글 :
: : : : 바이너리 파일을 읽어주세요.
: : : : 이 파일을 읽어야 하는데 잘 안되네요.
: : : : Q&A에 나온 방식으로 읽었는데 원래 데이터가 이상한건지
: : : : 아니면 바이너리 읽는 방식이 다른 방식이 있는지 알고 싶습니다.
: : : : 고수님들 한번 읽어봐주세요.부탁드립니다.

+ -

관련 글 리스트
36952 바이너리 파일 좀 읽어주세요. 30억 1083 2004/08/24
36957     Re:바이너리 파일 좀 읽어주세요. smleelms 1200 2004/08/24
36959         Re:Re:바이너리 파일 좀 읽어주세요. 30억 1124 2004/08/24
36961             Re:Re:Re:바이너리 파일 좀 읽어주세요. 김광수 1462 2004/08/24
36960             Re:Re:Re:바이너리 파일 좀 읽어주세요. smleelms 1342 2004/08/24
36962                 Re:Re:Re:Re:바이너리 파일 좀 읽어주세요. bigdream 1308 2004/08/24
36964                     Re:Re:Re:Re:Re:바이너리 파일 좀 읽어주세요. smleelms 1170 2004/08/24
36965                         정말 정말 감사드립니다. bigdream 914 2004/08/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.