Integer in seine Bits zerlegen
-
Hi!
Ich habe folgendes Problem:
Ich will eine virtuelle Maschine mit einer festen Befehlslänge von 32 Bit basteln. Ich lese die einzelnen Befehlssequenzen in einen Integer ein. Jetzt das Problem:
Die Sequenz sieht so aus: <Opcode (8 Bit)><Parameter 1 (12 Bit)><Parameter 2 (12 Bit)>. Den Opcode kann ich ja zur not noch als unsigned Char auslesen, weil da die 8 Bit ja genau passen, aber wie mache ich das bei den beiden Parametern? Es gibt ja keinen Standartdatentyp, der 12 Bit hat. Hat jemand eine Idee, wie ich das parsen könnte, damit ich die Sequenz in einer Datei speichern, bzw, wieder auslesen kann?MfG
FloFri
-
helfen dir Bitfelder?
struct command { integer opcode : 8; integer param1 : 12; integer param2 : 12; }
-
Wieder was gelernt, wusste noch gar nicht, dass es so etwas gibt. Nun noch 2 Fragen:
1. Geht das mit allen Standartdatentypen (also auch mit char)?
2. Wie kann ich das denn parsen, also 4 Byte int zu command, bzw. command zu 4 Byte int?
-
FloFri schrieb:
Wieder was gelernt, wusste noch gar nicht, dass es so etwas gibt. Nun noch 2 Fragen:
1. Geht das mit allen Standartdatentypen (also auch mit char)?ja
FloFri schrieb:
2. Wie kann ich das denn parsen, also 4 Byte int zu command, bzw. command zu 4 Byte int?
Wie meinst du das?
-
FloFri schrieb:
1. Geht das mit allen Standartdatentypen (also auch mit char)?
Nicht mit allen, aber mit allen ganzzahligen (d.h. float und double gehen z.B. nicht)
2. Wie kann ich das denn parsen, also 4 Byte int zu command, bzw. command zu 4 Byte int?
"union{int i;command c};" oder C++ reinterpret_cast<>
-
Danke! Eine letzte Frage: Ich habe eine Datei. Jetzt möchte ich in die Datei direkt hinter einander solche integer-sequenzen schreiben, bzw. lesen. Wie mache ich das denn am besten, weil, mit fstream und >> funktioniert es nicht wirklich, da er diese ganzen zahlen nicht aufteilt.
-
Ich habe jetzt das hier probiert:
int i = 9999; command com = reinterpret_cast<command>(i);
Der Compiler sagt allerdings, dass hier der reinterpret_cast nicht gültig ist oder kann man das nur auf einzelne felder machen?
-
fstream::read() bzw. fstream::write()
(@reinterpret_cast: Wie lautet denn die genaue Fehlermeldung?)
-
invalid reinterpret_cast from type `int' to type `command'
-
ich habe eben in die referenz geschaut, wegen read und write, die helfen aber leider auch nicht viel weiter, da die ja in einen cstring einlesen und die anzahl der chars, die gelesen werden sollen benötigen. Ich bräuchte aber etwas, was in einen int einliest und dem am besten die anzahl der bits oder bytes, die gelesen werden sollen übergeben werden.
-
Wenn ich dich richtig verstehe, willst du command's lesen bzw. schreiben, oder? Dann versuch's mal damit:
command c; char cdata[4]; //schreiben: strcpy(cdata,c); out.write(cdata,4); //lesen: in.read(cdata,4); strcpy(c,cdata);
-
cannot convert `command' to `char*' for argument `1' to `char* strcpy(char*, const char*)'
Ich will "nur", dass ein integer in seine bestandteile zerlegt wird, also die ersten 4 bits hier rein, die nächeten 12 da rein und die letzten 12 dort rein.