Binärdaten interpretieren
-
SeppJ schrieb:
Boost Serialization.

Ich wuerde bei der Standardbibliothek einfach folgendes machen (ungetestet):
#include <iostream> #include <iterator> #include <utility> #include <string> #include <type_traits> template<typename T> // enable_if erzeugt eine zyklische Abhaengigkeit bei der user-generierten spezialisierung std::pair<T, bool> get(std::istream& is, std::streamoff offset) { // C++11 :arrow_right: static assertion mit std::is_arithmetic is.seekg(offset, std::ios_base::beg); return std::make_pair( *std::istream_iterator<T>( is ), static_cast<bool>(is) ); } template<> std::pair<std::string, bool> get< std::string >(std::istream& is, std::streamoff offset) { is.seekg(offset, std::ios_base::beg); std::pair<std::string, bool> rval; std::getline(is, rval.first, '\0'); rval.second = is; return rval; }
-
Something like that ...
std::vector<unsigned char> bytes(1024*1024); std::ifstream file("my_binary_file", std::ios::binary); file.read(bytes.data(), file_size); file.close();Danach einfach mit
bytesarbeiten.
-
knivil schrieb:
Something like that ...
std::vector<unsigned char> bytes(1024*1024); std::ifstream file("my_binary_file", std::ios::binary); file.read(bytes.data(), file_size); file.close();Das geht doch schoener:
std::ifstream file("my_binary_file", std::ios::binary); std::ostringstream stream; stream << file.rdbuf(); std::string str = stream.str(); std::vector<unsigned char> bytes( str.begin(), str.end() );Angenommen die char -> unsigned char Konvertierung laeuft wie erwartet.
-
std::vector<unsigned char> bytes(std::istream_iterator<char>(std::ifstream("my_binary_file", std::ios::binary).seekg(0)), std::istream_iterator<char>()); // ^ pseudo-lvalue-cast
-
camper schrieb:
std::vector<unsigned char> bytes(std::istream_iterator<char>(std::ifstream("my_binary_file", std::ios::binary).seekg(0)), std::istream_iterator<char>());camper ist ja so ein king...
Aber ich kann das auch (zweizeiler):
std::string str = dynamic_cast<std::ostringstream*>(&(std::ostringstream() << std::ifstream("my_binary_file", std::ios::binary).rdbuf()))->str() ; std::vector<unsigned char> bytes( str.begin(), str.end() );
-
Sone schrieb:
std::string str = dynamic_cast<std::ostringstream*>(&(std::ostringstream() << std::ifstream("my_binary_file", std::ios::binary).rdbuf()))->str() ; std::vector<unsigned char> bytes( str.begin(), str.end() );
Und warum muss es vorher unbedingt in einen String, wenn man doch vom Stream direkt in den Vector lesen könnte?
-
ipsec schrieb:
Sone schrieb:
std::string str = dynamic_cast<std::ostringstream*>(&(std::ostringstream() << std::ifstream("my_binary_file", std::ios::binary).rdbuf()))->str() ; std::vector<unsigned char> bytes( str.begin(), str.end() );
Und warum muss es vorher unbedingt in einen String, wenn man doch vom Stream direkt in den Vector lesen könnte?
Wie meinste das?
-
Sone schrieb:
Und warum muss es vorher unbedingt in einen String, wenn man doch vom Stream direkt in den Vector lesen könnte?
Wie meinste das?
So wie ers geschrieben hat. Wozu den std::string str?
-
pumuckl schrieb:
Sone schrieb:
ipsec schrieb:
Und warum muss es vorher unbedingt in einen String, wenn man doch vom Stream direkt in den Vector lesen könnte?
Wie meinste das?
So wie ers geschrieben hat. Wozu den std::string str?
Ich kann doch wohl kaum
std::vector v( dynamic_cast<std::ostringstream*>(&(std::ostringstream() << std::ifstream("my_binary_file", std::ios::binary).rdbuf()))->str() );Schreiben. Die start-end iteratorenpaar Version funktioniert hier dank prvalue auch nicht. Also wie ohne Puffer?
-
Es gibt wohl einen quote-bug.
Edit: Pumuckl hat falsch gequotet.
-
Sone schrieb:
Ich kann doch wohl kaum
std::vector v( dynamic_cast<std::ostringstream*>(&(std::ostringstream() << std::ifstream("my_binary_file", std::ios::binary).rdbuf()))->str() );Schreiben. Die start-end iteratorenpaar Version funktioniert hier dank prvalue auch nicht. Also wie ohne Puffer?
Mit
istream_iterator, wie camper es bereits geschrieben hat.
-
ipsec schrieb:
Sone schrieb:
Ich kann doch wohl kaum
std::vector v( dynamic_cast<std::ostringstream*>(&(std::ostringstream() << std::ifstream("my_binary_file", std::ios::binary).rdbuf()))->str() );Schreiben. Die start-end iteratorenpaar Version funktioniert hier dank prvalue auch nicht. Also wie ohne Puffer?
Mit
istream_iterator, wie camper es bereits geschrieben hat.-.-
Ich meinte, meine Version. Campers ist die mit Streamiteratoren. Ich meinte meine mit dem Stringstream. Klar, dass die nicht so gut ist wie campers, ich wollte sehen ob ich nen zwei/ein-zeiler hinbekomme

-
Sone schrieb:
Die start-end iteratorenpaar Version funktioniert hier dank prvalue auch nicht.
lambda
auto v = [](std::ostringstream&& s){ return s << std::ifstream("my_binary_file", std::ios::binary).rdbuf(), [](std::string s){ return std::vector<unsigned char>(begin(s), end(s)); }(s.str()); }(std::ostringstream());