0

MySQL データベースからバイナリ データを取得しています。mysqlpp::sql_blob タイプとして出てきます。

この BLOB がシリアル化された Google Protobuf であることはたまたまです。正常にアクセスできるように、シリアル化を解除する必要があります。

ParseFromString() は mysqlpp:sql_blob 型を対象としていないため、これはコンパイル エラーになります。

protobuf.ParseFromString( record.data );

ただし、キャストを強制すると、正常にコンパイルされます。

protobuf.ParseFromString( (std::string) record.data );

これは安全ですか?mysqlpp ドキュメントからのこのスニペットのために、私は特に心配しています:

「C++ 文字列はバイナリ データを適切に処理するため、sql_blob の代わりに std::string を使用できると考えるかもしれませんが、現在の String の設計は C 文字列を介して std::string に変換されます。その結果、BLOB データは切り捨てられます。 SSQLS の作成中に最初に埋め込まれた null 文字で。文字列または SSQLS メカニズムのいずれかを完全に再設計しない限り、これを修正する方法はありません。」

ご協力ありがとうございます。

4

1 に答える 1

1

その引用から判断すると、問題になるようには見えません (基本的には、ブロブにヌル文字が見つかった場合、そこで文字列を停止すると言っていますが、ASCII 文字列には途中でランダムなヌルはありません) . ただし、これは内部化の問題を引き起こす可能性があります (マルチバイト文字セットは途中で null を持つ場合があります)。

于 2009-10-09T01:19:26.647 に答える