2009-10-09 4 views
0

나는 내 MySQL 데이터베이스에서 일부 바이너리 데이터를 가져오고있다. 그것은 mysqlpp :: sql_blob 타입으로 나온다.mysqlpp :: sql_blob을 std :: string으로 변환하는 것이 안전합니까?

이 BLOB가 직렬화 된 Google Protobuf 일뿐입니다. 난 그것을 정상적으로 액세스 할 수 있도록 그것을 역 직렬화해야합니다. SQL_BLOB 유형 :

protobuf.ParseFromString(record.data); 

그러나 나는 캐스트를 강제하는 경우, 그것은 확인을 컴파일 :

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

인가 ParseFromString()가 mysqlpp 의도되지 않기 때문에

이것은, 컴파일 오류를 제공합니다 이 금고? 나는 때문에 mysqlpp 문서에서이 조각의 특히 걱정 : 당신의 도움을

"Because C++ strings handle binary data just fine, you might think you can use std::string instead of sql_blob, but the current design of String converts to std::string via a C string. As a result, the BLOB data is truncated at the first embedded null character during population of the SSQLS. There’s no way to fix that without completely redesigning either String or the SSQLS mechanism."

감사합니다!

답변

1

그 견적으로 판단하는 것이 문제가되지 않는 것처럼 보입니다. (기본적으로 null 문자가 BLOB에서 발견되면 문자열을 멈추게합니다. 그러나 ASCII 문자열은 무작위로 null을 갖지 않습니다. 그들 중반). 그러나 내부화에 문제가 발생할 수 있습니다 (멀티 바이트 문자셋의 중간에 null이있을 수 있음).

+0

기본적으로 protobuf를 직렬화 한 방법에 따라 다릅니다. 바이너리로 직렬화했다면 조심해! 당신은 길을 걷기위한 문제에 대해 스스로를 생각하고 있습니다. 그러나 google :: protobuf :: TextFormat :: PrintToString() 및 ParseFromString() 함수를 사용하면 괜찮습니다. – Runcible

관련 문제