Verdrehte Bytes mit fread
-
Hallo,
struct { int main(void) { ... unsigned long long FirstSeen; ... } apinfo int main(void) { FILE *quelle; quelle = fopen("test.ns1", "r+b"); ... fread(&apinfo.FirstSeen, 8, 1, quelle); ...
Die Datei ist Binär geöffnet, wenn ich jetzt 8bytes an irgend einer Stelle lesen will bekomm ich die zwar in meine Variable rein, jedoch sind die Bytes verdreht. die stehn genau verkehrt herrum drin.
Bsp:
In der Datei stehen sie so drin: 805A6A5183AAC601
In apinfo.FirstSeen aber so: 01C6AA83516A5A80Wenn ich den Wer direkt der Variable zuwiese stimmt alles, aber halt nicht wenn ich es rauslese.
Wie bekomme ich das in den griff? Kann ja so schlecht mit der Zahl weiterrechen
-
Denkt euch bitte die 2te Zeile ( int main(void) { ) Weg, die gehört da nicht hin
-
wie schreibst du?
-
Die Datei kommt von einem anderem Programm. Ich schreibe die nicht slebst. Muss sie nur lesen. Hab von der Datei den exakten aufbau.
-
http://de.wikipedia.org/wiki/Byte-Reihenfolge
musst du entweder selber umdrehen oder mal nach "htonl" / "ntohl" suchen.
-
Hallo,
Habe es nun so gelöst:#include <stdint.h> // uint64_t #include <winsock.h> // ntohl uint64_t big2little(uint64_t i){ return i = (ntohl(i)*0x100000000ULL)+ntohl(i >>= 32); }
konvertiert zwischen den Endians hin und her, für 64bit Integer.
Hab mir ne ganze weile überlegt wie ich die Bytes selber drehen könnte, bin aber nicht so recht drauf gekommen. Hat da jemand eventuell ein Tipp?
-
-
omg
#include <stdint.h> // uint64_t #include <winsock.h> // ntohl uint64_t big2little(uint64_t i) { return (ntohl(i & 0xFFFFFFFF) << 32) | ntohl(i >> 32); }
deine >>= und "return i =" sind irgendwie nutzlos. und die multiplikation haettest du auch als shift machen koennen. die addition hab ich mit nem bitweisen OR geloest.
-
c.rackwitz schrieb:
ntohl(i & 0xFFFFFFFF) << 32
der rückgabewert von ntohl ist 32 bittig. damit shifteste den zu 0
insofern war die multiplikation von vorher doch nicht so schlecht
-
net schrieb:
c.rackwitz schrieb:
ntohl(i & 0xFFFFFFFF) << 32
der rückgabewert von ntohl ist 32 bittig. damit shifteste den zu 0
Schlimmer noch: Das Verhalten ist undefiniert.
-
so könnt's gehen
return ((uint64_t)ntohl(i))<<32 | ntohl(i>>32);
-
wenn man sich erstmal an beliebig breite/genaue datentypen gewoehnt hat, muss man erstmal umdenken
-
Der Code von net geht übrigends hervorragend
Wo gibts denn "belibig breite" datentypen?
-
in anderen sprachen :p
-
c.rackwitz schrieb:
in anderen sprachen :p
hauptsächlich genutzt von beliebig breiten Programmierern.