Binärdaten interpretieren
-
Hallo!
Ich habe hier eine Datei im Binärformat vorliegen.
Ich möchte diese nun "entschlüsseln" indem ich Bytes interpretiere.
z.B.getInt(Datei, Offset, BitAnzahl) //Öffnet Datei, geht zum Offset und liefert einen integer der Länge ByteAnzahl getUnsigned(Datei, Offset, BitAnzahl) //Öffnet Datei, geht zum Offset und liefert einen unsigned integer der Länge BitAnzahl getDouble(Datei, Offset) //Öffnet Datei, geht zum Offset und liefert einen Double getString(Datei, Offset) //Öffnet Datei, geht zum Offset und liefert einen null Terminierten String. //Float, wide String, LittleEndian, BigEndian, etc.gibt es da schon was fertiges?
Ich möchte nicht alle Funktionen selber implementieren.
-
Dudeldu schrieb:
gibt es da schon was fertiges?
Wie wäre es mit einem Hex-Editor?
-
Ja, Hexeditor ist gut nur kann ich damit nicht Programmieren. Ich möchte die Daten ja nicht nur lesen sondern auch weiterverarbteiten in c++ Quellcode.
-
Dudeldu schrieb:
Ja, Hexeditor ist gut nur kann ich damit nicht Programmieren. Ich möchte die Daten ja nicht nur lesen sondern auch weiterverarbteiten in c++ Quellcode.
Willst du nicht im Grunde nur Binärdaten in verschiedene Datentypen einlesen...

-
Boost Serialization.
-
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());