В строковых символах нет ничего особенного
std::istringstream iss(std::string(data, N));
setBlob(&iss);
Конечно, если вы делаете
std::istringstream iss("haha a null: \0");
Он будет интерпретировать это как строку в стиле C, преобразованную в std::string
, и, таким образом, остановится на \0
, не принимая его как реальный байт содержимого. Указание std::string
размера явно позволяет ему использовать любой нулевой байт в качестве данных реального содержимого.
Если вы хотите читать напрямую из массива char, вы можете использовать strstream
std::istrstream iss(data, N);
Это будет непосредственно считывать данные, предоставленные data
, до N
байтов. strstream
официально объявлен "устаревшим", но все еще будет в C ++ 0x, так что вы можете использовать его. Или вы создаете свой собственный streambuf
, если вам действительно нужно читать с необработанного char*
таким образом.
struct myrawr : std::streambuf {
myrawr(char const *s, size_t n) {
setg(const_cast<char*>(s),
const_cast<char*>(s),
const_cast<char*>(s + n));
}
};
struct hasb {
hasb(char const *s, size_t n)
:m(s, n)
{ }
myrawr m;
};
// using base-from-member idiom
struct myrawrs : private hasb, std::istream {
myrawrs(char const *s, size_t n)
:hasb(s, n),
std::istream(&static_cast<hasb*>(this)->m)
{ }
};