현재 수신 측에 특수 문자를 전달하여 직렬화 된 문자열의 끝에 도달했음을 알리는 것처럼 보입니다. 이것으로 너를 망칠 수있는 백만 가지 경우가있다 :
구조체가 그 특수 문자와 같은 바이트를 포함한다면? 다른 특수 문자로 이스케이프합니다. 구조체에 특수 문자가 오는 이스케이프 문자와 동일한 바이트 시퀀스가 포함되어 있는지 확인하십시오.
네, 그게 가능하지만, 아주 좋은 해결책은 아니며, 이스케이프 문자를 찾기 위해 파서를 작성해야한다고 생각합니다. 그러면 나중에 코드를 살펴 보는 사람은 두 시간 동안 그림을 만들려고합니다. 무슨 일이 일어나고 있는지.
(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'
제 생각에는
에,이되지 않을 수도 있습니다 메모리를 가장 효율적인 방법 (당신이 할 수 아마도 어딘가에 바이트를 저장하는 것)하지만 분명히 당신이하고있는 일에서 분명하고, 다음 사람은 이것을 훨씬 더 좋아할 것입니다.
왜 downvote? –
나는 투표를 한 사람이 아니었다. 그러나 널 포인터 (null length pointer)가 널 문자열이 아닌 방법으로 인코딩하는 방법에 대한 질문에 대답했다고 생각하지 않는다. 나는 특별한 길이의 값으로 그것을 할 것이다. – JeremyP
당신은 정확합니다. 도중에 편집. 고마워요! –