2010-06-16 3 views
1

제목이 문제를 설명하고 있기를 바랍니다. 누구든지 더 좋은 아이디어가 있다면 그것을 바꿀 것입니다.구조체에서 이진 블록 만들기

I 이런 구조체로 정보를 저장하고있어 :

struct AnyStruct 
{ 
    AnyStruct() : 
     testInt(20), 
     testDouble(100.01), 
     testBool1(true), 
     testBool2(false), 
     testBool3(true), 
     testChar('x') {} 

    int testInt; 
    double testDouble; 
    bool testBool1; 
    bool testBool2; 
    bool testBool3; 
    char testChar; 

    std::vector<char> getBinaryBlock() 
    { 
     //how to build that? 
    } 
} 
구조체는 다음과 같은 구조의 바이너리 바이트 버퍼에 네트워크를 통해 전송되어야

이 따르면

Bit 00- 31: testInt 
Bit 32- 61: testDouble most significant portion 
Bit 62- 93: testDouble least significant portion 
Bit  94: testBool1 
Bit  95: testBool2 
Bit  96: testBool3 
Bit 97-104: testChar 

정의 결과 std :: vector는 13 바이트 (char == byte)의 크기를 가져야합니다.

이제는 다른 데이터 유형에서 이러한 패킷을 어떻게 구성 할 수 있을지 궁금합니다. 이미 많은 페이지를 읽고 std :: bitset 또는 boost :: dynamic_bitset과 같은 데이터 유형을 찾았지만 어느 것도 내 문제를 해결하지 못하는 것 같습니다.

나는 위의 코드가 단지 예일 뿐이며, 원래의 표준은 훨씬 더 복잡하고 더 많은 다른 데이터 유형을 포함한다는 것을 알기 쉽다고 생각합니다. 위의 예제를 해결하면 복잡한 구조에 대한 제 문제가 해결 될 것입니다.

마지막 점 : 문제는 내가 생각하는 단지 STL 또는 부스트 (

답변

0

이제 데이터 유형의 비트 시퀀스를 생성 한 다음이 비트 세트를 하나의 큰 비트 세트에 연결하는 데 std::bitset을 사용했습니다. 그러면 필요한 데이터가 저장됩니다. 작은/큰 엔디안을 확인해야합니다.

1

같은 표준 C의 휴대용 언어 기능을 ++ 사용하여 해결해야 당신이 FAQ에 설명되어 필요한 모든 : http://www.parashift.com/c++-faq-lite/serialization.html

+0

제가 알 수있는 한, 이것은 일반적으로 직렬화에 관한 것입니다. 데이터 형식을 직렬화 할 수있는 방법을 이해합니다. 문제는 주어진 데이터 유형을 바이너리 형식으로 변환하여 바이너리 컨테이너의 올바른 위치에 추가하는 것입니다. 다음 질문은 내가 어떻게 std :: string 또는 std :: vector 을 생성 할 수 있는가입니다. – MOnsDaR

0

은 기본적으로 당신은 memcpy를 사용하여 오프셋 (sizeof()를 사용). 그럼 당신은 올바른에 대한 각 변수의 내용을 복사 할 클래스에있는 모든 변수의 전체 크기의 길이 부호 char (바이트)의 배열을 할당 할 것이다.

이것은 단지 기본적인 접근 방법이며 zerm의 대답에있는 C++ faq 링크를 살펴 보도록 권합니다.

+0

memcpy가 단지 전체 바이트를 복사 할 수 있기 때문에 이것은 문제를 해결하지 못합니다. 예 : 8 개의 bool 값을 올바른 위치의 char로 복사 할 수 없습니다. 아니면 잘못 알았습니까? – MOnsDaR

+0

당신은하지 않았지만, bool의 크기가 단지 1 비트라고 가정하는 것은 잘못되었습니다. sizeof (bool)를 사용하면 1이라는 것을 알 수 있습니다. 이는 1 바이트를 의미합니다. – PeterK

+0

네, 그렇지만 bool은 비트에 저장 될 수 있습니다. 이런 식으로 사용해야하는 표준에 명시되어 있습니다. (위의 예제에서 3 개의 bool 값이 94-96의 비트에 저장되어야 함) memcpy를 사용하여이 기능을 이해하지 못했습니다. – MOnsDaR

관련 문제