うごくものづくりのために

技術的な備忘録がメインです。

GoogleProtocolBuffer(C++)で、NULL文字(/0, 0x00)を含むデータをパースする方法

GoogleProtocolBufferのC++版で、NULL文字を含むデータをパースする際にハマったのでメモ。

socket通信のrecv()で受け取ったデータをParseFromString()でパースしようとした際、 データに"0x00"が出現するとヌル文字(\0)だと解釈して、パースが正常終了しませんでした。

結論としては、char型の配列をstring型に変換し、かつ変換の際にサイズを指定してやればOKでした。

  /*** 初期設定などなど省略 ***/

  char buf[BUF_SIZE];
  ProtobufClass proto;  // プロトコルバッファのメッセージ解析用インスタンス
  size_t recv_size;

  recv_size = recv(sock, buf, sizeof(buf), 0);

  std::string str(buf, recv_size);
  proto.ParseFromString(str);