2012-04-05 4 views
2

나는 구조체를 바이트 스트림으로 직렬화하고있다. 내 방법은 간단합니다 : 리틀 엔디안 순서로 모든 int를 포장하고 널 종결자를 포함하여 문자열을 복사하십시오. 다른 쪽에서는 바이트 스트림의 압축을 푸는 방법을 정적으로 알아야하며 추가 메타 데이터는 없습니다.문자열을 C로 serialize

내 문제는 NULL 포인터를 처리하는 방법을 모르겠다는 것입니다.

스트림에 추가 메타 데이터가 없기 때문에 뭔가를 보내야합니다.

  1. 보내기 '\ 0'과 수신 측이 '\ 0'을 보내 어떤 경우

  2. 에 NULL로 해석하게하고합니다

    나는 다음과 같은 두 가지 옵션을 고려 수신 측은 어떤 경우에도 '\ 0'으로 해석합니다 (바이트 할당)

  3. char * str == NULL을 나타내는 특수 문자 보내기 ETX, EOT, EM?

당신은 어떻게 생각하십니까?

답변

4

현재 수신 측에 특수 문자를 전달하여 직렬화 된 문자열의 끝에 도달했음을 알리는 것처럼 보입니다. 이것으로 너를 망칠 수있는 백만 가지 경우가있다 :

구조체가 그 특수 문자와 같은 바이트를 포함한다면? 다른 특수 문자로 이스케이프합니다. 구조체에 특수 문자가 오는 이스케이프 문자와 동일한 바이트 시퀀스가 ​​포함되어 있는지 확인하십시오.

네, 그게 가능하지만, 아주 좋은 해결책은 아니며, 이스케이프 문자를 찾기 위해 파서를 작성해야한다고 생각합니다. 그러면 나중에 코드를 살펴 보는 사람은 두 시간 동안 그림을 만들려고합니다. 무슨 일이 일어나고 있는지.

(tl; dr) 대신 ...은 직렬화 된 문자열의 처음 32 비트를 문자열의 바이트 수와 동일하게 만듭니다. 이것은 직렬화 당 4 바이트의 비용으로 모든 문제를 해결할 수 있습니다. 파서를 작성하거나 특수 문자에 대해 걱정할 필요가 없으며 코드를 읽는 다음 사람이 훨씬 쉽게 사용할 수 있습니다!

편집 JeremyP에

덕분에 난 그냥 내가 정말 귀하의 질문에 대답하지 않았다는 것을 깨달았다를. 모든 문자열에 대해 다음 사람 중 하나를 보냅니다.

struct s_str { bool is_null; int 크기; char * str; };

null 인 경우 is_null을 true로 설정하면 다른 두 가지를 걱정할 필요가 없습니다. 크기가 0이면 is_null을 false로 설정하고 크기를 0으로 설정하십시오. STR 하나에 불과 '\ 0', false로 is_null 설정, 크기를 포함하고있는 경우 STR [0] '\ 0'

제 생각에는

에,이되지 않을 수도 있습니다 메모리를 가장 효율적인 방법 (당신이 할 수 아마도 어딘가에 바이트를 저장하는 것)하지만 분명히 당신이하고있는 일에서 분명하고, 다음 사람은 이것을 훨씬 더 좋아할 것입니다.

+0

왜 downvote? –

+0

나는 투표를 한 사람이 아니었다. 그러나 널 포인터 (null length pointer)가 널 문자열이 아닌 방법으로 인코딩하는 방법에 대한 질문에 대답했다고 생각하지 않는다. 나는 특별한 길이의 값으로 그것을 할 것이다. – JeremyP

+0

당신은 정확합니다. 도중에 편집. 고마워요! –

2

하지 마십시오. 여분의 바이트를 사용하여 길이를 저장하고 데이터 문자열과 연결하십시오. 수신 측에서는 로컬 버퍼로 읽어야하는 길이를 알 수 있도록 길이를 확인할 수 있습니다.

2

이것은 프로토콜에서 포인터의 중요성에 따라 다릅니다. 포인터가 중요하다면, 즉받는 사람이 구조체를 다시 작성하는 방법을 알 필요가 있다면 포인터를 보내야합니다. 존재 여부를 나타내는 0/0이 아닌 바이트이거나 포인터가 가리키는 바이트 수를 나타내는 정수일 수 있습니다.

예 : 구조체 푸 { INT의 *의 편곡, 의 char * 텍스트 }

구조체 푸는 다음과 같이 직렬화 수 :

나는에 대한 기존의 라이브러리를 사용하기를 권합니다
<arr length>< arr ><text length><text> 
    4 bytes n bytes 4 bytes  n bytes 
2

직렬화. 지금은 두 가지를 생각할 수 있습니다 : tpl 및 gwlib의 gwser.

소개 tpl :

저장하고 빠르고 쉽게 C의 데이터를 다시로드 TPL을 사용할 수 있습니다. Tpl은 파일, 메모리 버퍼 및 파일 설명자와 함께 작동하므로 파일 형식, IPC 메시지 형식 또는 데이터를 저장하고 검색해야하는 모든 시나리오 시나리오로 사용하기에 적합합니다 ( ).

gwlib은 매우 자세한 정보는 아니지만 몇 가지 사용 예가 나와 있습니다.

관련 문제