Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » char[4] in int konvertieren

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.01.2007, 21:44 Uhr
derphilipder



Ich habe ein eigentlich simples Problem...
Ich lese aus einer Datei Blöcke von 4 byte aus, die einen unsigned int Wert darstellen.


C++:
char buff_4[4];
stream.readRawBytes(&buff_4, 4);




Direkt mit stream-Operator >> geht nicht, weil es manchmal auch nur 2 byte Blöcke sind.
Nun möchte ich den Wert des char-array in eine int-Variable schreiben.
Mir fällt im Moment nichts gescheiteres ein, als per Bitmaske jede Stelle mit ihrem Stellenwert zu multiplizieren und dann aufzuaddieren.
Nicht gerade performant...zumal die bits ja schon so gespeichert sind, wie ich sie haben will, nur halt mit dem falschen Datentyp. Wie lös ich das?

Ist aber ja auch nicht gerade ne exotische Sache, int-Zahlen aus ner Datei zu lesen, da gibts doch sicher ne Standardlösung, oder? Hab nur nix gefunden...ich bin ne echte Google Niete!
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.01.2007, 21:58 Uhr
Blubber2063



Na in den du den Char Zeiger in einen Int Zeiger Castest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.01.2007, 22:06 Uhr
Pler
Einer von Vielen
(Operator)


int i;
i = *((int*)buff_4);

so sollte es gehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.01.2007, 22:25 Uhr
0xdeadbeef
Gott
(Operator)


Ah, ganz so einfach ist es nicht. Das Problem ist, dass du u.U. nicht weißt, welchen Bytesex die Zahl in der Datei hat. Es empfiehlt sich also, sich in der Datei auf einen Standard zu eignen, z.B. Netzwerknotation. Dann sieht das so aus:

C++:
#include <netinet/in.h>

// ...
char s[4];
fread(s, 1, 4, fd);

// Hier wichtig:
uint32_t local = ntohl(*(int*)(s))
uint32_t remote = htonl(local);

fwrite(&remote, 1, 4, fd);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.01.2007, 08:47 Uhr
ao

(Operator)


Wenn du manchmal nur zwei Bytes aus der Datei holst, darfst du nicht vergessen, das buff_4-Array zu Anfang mit 0 zu initialisieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.01.2007, 10:34 Uhr
derphilipder



Auf das Zeiger casten hätt ich auch wirklich selber kommen können...vielen Dank!

Die Daten sind immer in Little-Endian-Anordnung gespeichert. (.wav datei)
Dann steht doch das LSB nach dem auslesen ganz "rechts" in buf_4[3] und ich bräuchte nur wie beschrieben zu casten, oder?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.01.2007, 13:00 Uhr
ao

(Operator)


Bei Little-Endian steht das LSB in buf_4[0].
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
20.01.2007, 12:01 Uhr
derphilipder



Und in welcher Reihenfolge stehen die Bits bei Windows in einer int Variablen?
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
20.01.2007, 12:32 Uhr
(un)wissender
Niveauwart


Bei Windows ist die falsche Frage Gebe dir aber trotzdem die richtige Antwort.
Es kommt auf den Prozessor an. Da der bei windows meistens x86-kompatibel ist nimmst du Little Endian.

Kannst es aber auch testen:


C++:
#include <iostream>

bool isLittleEndian()
{    
    char test[sizeof(unsigned)] = {0};
    *reinterpret_cast<unsigned*>(&test[0]) = 1;
    return char(1) == test[0];
}

int main()
{    
    std::cout << "LittleEndian: " << std::boolalpha << isLittleEndian() << std::endl;
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.01.2007, 12:36 Uhr
derphilipder



Ok, dann sollte das ja kein Problem sein...
--
Konfuzius says: "A man who goes to bed with an itchy asshole is a man who wakes up with stinky finger!"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: