문제

일부 데이터를 사용자 정의 이진 파일 형식으로 저장할 수 있어야합니다. 나는 전에 내 자신의 파일 형식을 디자인 한 적이 없습니다. C#, Java 및 Ruby/Perl/Python Worlds 사이를 여행하는 데 친숙한 형식이어야합니다.

파일부터 시작하려면 레코드로 구성됩니다. 안내 필드 및 JSON/YAML/XML 패킷 필드. 구분 제로 무엇을 사용 해야할지 잘 모르겠습니다. 쉼표, 탭 또는 뉴 라인의 종류는 너무 깨지기 쉬운 것 같습니다. Excel은 무엇을합니까? 아니면 Pre-XML OpenOffice 형식? ASCII 숯 0 또는 1을 사용하는 경우 어디에서 시작 해야할지 확실하지 않습니다. 주제에 관한 기사 나 책이 있습니까?

이 파일 형식은 나중에 "헤더 섹션"을 포함하도록 확장 될 수 있습니다.

참고 : 시작하려면 .NET에서 작동하지만 형식을 쉽게 휴대 할 수 있기를 바랍니다.

업데이트:
"패킷"의 처리는 느릴 수 있지만 파일 형식 내에서 탐색은 할 수 없습니다. 그래서 XML이 테이블에서 벗어 났다고 생각합니다.

도움이 되었습니까?

해결책

휴대용 바이너리 파일 형식을 만들기위한 일반적인 힌트를 추가하려고합니다.

이진 파일 형식을 발명한다는 것은 문서화를 의미하며, 비트가 어떻게 진행되어야하는지 및 의미하는 바를 의미합니다. 코딩이 아니라 문서화입니다.

이제 힌트 :

  1. 무엇을 해야할지 결정하십시오 endianess. 좋은 방법과 간단한 방법은 한 번 그리고 영원히 결정하는 것입니다. 공통 PC (x86)에서 전환 (성능)을 절약하기 위해 사용될 때 선택은 바람직하게는 엔디 어가 바람직하지 않을 것입니다.

  2. 만들다 헤더. 예, 항상 헤더를 갖는 것이 좋습니다. 파일의 첫 바이트는 어떤 형식을 엉망으로 만들고 있는지 알려줄 수 있어야합니다.

    • 당신의 형식을 인식 할 수 있도록 Magic으로 시작하십시오 (ASCII String은 트릭을 수행합니다).
    • 버전을 추가하십시오. 파일 형식의 버전은 추가하기가 아프지 않으며 나중에 후진 호환성을 수행 할 수 있습니다.
  3. 마지막으로 데이터를 추가하십시오. 이제 데이터 형식은 구체적이며 항상 정확한 요구를 기반으로합니다. 기본적으로 데이터는 일부 데이터 구조의 이진 이미지에 저장됩니다. 데이터 구조는 당신이 생각해내는 것입니다.

어떤 종류의 지수로 데이터에 무작위로 액세스 해야하는 경우 B- 트리 갈 길이이지만, 모든 숫자가 필요하다면 모두 쓰기 위해 많은 숫자가 필요하다면 "배열"을 모두 읽으면 트릭을 수행합니다.

또한 a를 사용할 수 있습니다 TLV (유형 길이 값) 전방 호환성 개념.

다른 팁

"프로토콜 버퍼"를 사용하는 것은 어떻습니까? 효율적이고 휴대용, 버전 내성 범용 범용 바이너리 형식으로 설계된이 제품은 C ++, Java 및 Python을 제공합니다. 구글 라이브러리, 및 C#, Perl, Ruby 및 기타 커뮤니티 포트?

Guid에는 특정 데이터 유형이 없지만 (본질적으로) A와 메시지로 변성 할 수 있습니다. byte[].

보통 .NET 작업을 위해서는 권장합니다 protobuf-net (그러나 저자로서 나는 다소 편견이 있습니다) - 그러나 나중에 다른 언어를 사용하려면 Jon 's를 사용하여 더 잘 (장기) 할 수 있습니다. Dotnet-Protobufs; 그것은 당신에게 친숙한 API가 플랫폼 (protobuf-net이 .net xioms를 사용하는 곳)을 쫓아냅니다.

ASCII chars 0 또는 1은 각각 다른 문자와 마찬가지로 여러 비트를 차지하므로 (다른 문자와 마찬가지로) 저장하는 경우 "이진"파일이 그보다 몇 배 더 커집니다. 0의 텍스트 파일에서는 바이너리 파일이 아닙니다 :)

당신은 사용할 수 있습니다 바이린 라이터 원시 데이터를 직접 작성하려면 a 파일 스트림. 파악해야 할 유일한 부분은 메모리 형식 (일반적으로 어떤 종류의 객체 그래프)를 바이린 라이터가 소비 할 수있는 바이트 시퀀스로 변환하는 것입니다.

하지만, 당신의 주요 관심사가 이식성이라면, 나는 이진 형식에 대해 전혀 권장합니다. XML은 휴대 성 및 상호 운용성 문제를 해결하도록 정확하게 설계되었습니다. 파일 형식 으로서는 장점과 무게이지만, 그 문제를 해결하기 위해 당신이하는 트레이드 오프입니다. 사람이 읽을 수있는 형식이 테이블에서 벗어난 경우 마크의 대답 갈 길입니다. 이식성 휠을 재창조 할 필요가 없습니다!

바이너리 파일에 쓸 수있는 데이터 유형과 이진 파일의 목적이 무엇인지에 따라 다릅니다. 클래스 객체입니까 아니면 데이터를 기록합니까? 레코드 데이터 인 경우 XML 형식으로 넣는 것이 좋습니다. 이렇게하면 파일이 표준을 준수하는지 확인하기 위해 스키마 검증을 포함시킬 수 있습니다. Java와 .NET에는 모두 XML 형식에서 데이터를 가져오고 내보내는 도구가 있습니다.

당신의 형식이 다음과 같다고 가정합니다.

    struct Format
    {
        struct Header // 1
        {
            byte a;
            bool b1, b2, b3, b4, b5, b6, b7, b8;
            string name;
        }
        struct Container // 1...*
        {
            MyTypeEnum Type;
            byte[] data;
        }
    }

    enum MyTypeEnum
    {
        Sound,
        Video,
        Image
    }

그런 다음 다음과 같은 순차 파일을 가질 것입니다.


바이트 // a

바이트 // b

int // 이름 크기

char [] // 이름 (위에 지정된 크기가있는 경우, char는 .net에서 16 비트입니다)

int // mytypeenum 유형

int // 데이터 크기

바이트 [] // 데이터 (위에 지정된 크기가 있음)


그런 다음 원하는만큼 마지막 세 줄을 반복 할 수 있습니다.

읽으려면 사용합니다 BinaryReader 읽기 바이트, 정수 및 일련의 바이트를 지원합니다. 또 한있다 BinaryWriter.

또한 Microsoft .NET (따라서 Windows/Intel Machine에서)는 Little-Endian이라는 것을 기억하십시오. 그렇습니다 BinaryReader 그리고 BinaryWriter.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top