Mit Binärdaten arbeiten (input/output)
-
Ich frage mich, wie man möglichst effizient arbeitet, wenn man eine Menge von Binärdaten verwalten muss, die Streams lesen ja char Arrays ein und ich finde diese nicht besonders elegant um mit Binrädaten zu arbeiten. Klar geht es um die hex repräsentation, aber irgendwie hab ich da noch keinen Draht zu gefunden.
Was ist vor allem, wenn Zahlen aus einem und in ein Binärformat schreiben muss? Dazu kommt noch das Problem des Little-/Big-Endian.
Gibt es ne vernünftige Bibliothek, die einem das Werkeln mit Binärdaten erleichtert?
-
Seikilos schrieb:
Gibt es ne vernünftige Bibliothek, die einem das Werkeln mit Binärdaten erleichtert?
wenn du was spezielles suchst bestimmt. es wird aber schwierig sein etwas sehr allgemein gehaltenes, so wie du es hier beschreibst, zu finden.

-
Was gibt es denn im speziellen? Mich interessieren Libs, die mir halt ermöglichen Daten im Binärformat abzulegen, ohne die interpretation dieser
-
Seikilos schrieb:
Was gibt es denn im speziellen? Mich interessieren Libs, die mir halt ermöglichen Daten im Binärformat abzulegen, ohne die interpretation dieser
sqlite ist zum beispiel eine einfache möglichkeit daten in einer datei zu speichern. da liegt der vorteil aber eben bei der platformunabhängigkeit und integrität als bei der performance. das muss man für sich selbst abwägen. wenn performance wichtig ist, kommst du um ein auf die anwendung zugeschnittenes format nicht herum

-
Ja, aber es schreibt nicht in das von mir kontrollierte Format. Ich meinte so etwas wie in Datei xy die ersten 100 Bytes von meinem byte[] foo schreiben
-
ich bitte dich, dafür brauchts ja nun wirklich nicht einer externen bibliothek. das sind 4 zeilen code, wenn überhaupt. auch endian-awareness ist mit einem einzeiler erledigt.
-
sothis_ schrieb:
auch endian-awareness ist mit einem einzeiler erledigt.
Wie machst du das?
-
Du kannst ja auch die Standard-Filestreams mit dem Flag
std::ios::binarybearbeiten.
-
asdfhg schrieb:
sothis_ schrieb:
auch endian-awareness ist mit einem einzeiler erledigt.
Wie machst du das?
häufig mit einem dieser macros:
#define _SWAB16(val) asm("ror $8, %%ax":"=a"(val):"a" (val)) #define _SWAB32(val) asm("bswap %%eax":"=a"(val):"a" (val)) #define _SWAB64(val) asm("bswap %%rax":"=a"(val):"a" (val)) #define _SWAB64_32(val) asm("bswap %%eax\nbswap %%ebx\nmovl %%eax, %0\nmovl %%ebx, 4+%0\n":"=o"(val):"b"(val&0xFFFFFFFF),"a"(val>>32))das wie auch immer ist gcc inlineassembler, eine cl-variante ist aber auch schnell geschrieben.
das format in dem gespeichert wird sollte einheitlich sein, das programm sollte dann, je nachdem auf welcher architektur es läuft, die interpretation der daten übernehmen (ähnlich wie man es mit der network byte-order gelöst hat).
-
Ich krame es mal wieder aus.
Wie lese ich beispielsweise 8 Bytes binär aus einer Datei und wandele diese in ein double um?
(Außer mittels cin >> double_type;)
Die Frage stellt sich mir, weil ich evtl ja auch nur 7 Bytes in ein double packen will, falls ich die Spezifikation habe: Doubles sind signed 56 Bit lang, wenn ich da cin >> double_type lesen würde, würde da ja murks bei rumkommen, da ich ja dann die falsche Menge an bytes lesen würde
Das gleiche in Grün: Wie lese ich 2 Bytes als int ein