Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » convert unsigned to char string....

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
21.12.2003, 20:24 Uhr
~search
Gast


Hallo!

Hätte folgende Frage:
Weiß jemand wie man einen unsigned int (genauer: einen "uint32", also einen 32 bit int) in einen string (oder vielleicht auch in ein char array) konvertieren kann? Sinn dahinter ist nicht, dass man die Zahl beim output des Strings lesen kann, sondern das speichern der Bitsetzung des uint32 in einem String. Schreibe gerade an einem high-level-protocol und möchte meine Datenpackete als einen String versenden. Um die Länge der gesamten Message kontrollieren zu können, möchte ich an einer bestimmten Stelle in diesem String (also in meinem Header) die Länge der folgenden Nachricht speichern.

Wichtig ist also, dass ich die Bitsetzung meines unsigned int (uint32, also genau 4 Byte) in 4 chars des Strings oder auch in ein char array[4] unterbringe und diese im Nachhinein auch wieder herausbekomme. Habe schon versucht die Sache mit casten anzugehen. Es funktioniert jedoch nur, dass ich ein Byte meines uint32 in einen char speichere. Bei allem anderen weigert sich der Compiler.

Es währe mir wirklich viel weitergeholfen, wenn mir jemand sagen könnte, wie ich das hinbekommen kann. Am besten das Reinschreiben meines 4 Byte Int, als auch das Auslesen und wieder in einen uint32 speichern (damit man das ganze dann auch vergleichen kann). Also ich bin für jede hilfe dankbar!

Hier noch meine Versuche:

Die folgende Version kompiliert zwar, beim Ausführen fliegt einem jedoch der Speicher um die ohren....

C++:
// Versuch start

string msg_;
char* char_number_ = new char[4];
uint32 message_length_;

//---------------------------------------------------------
// build string for high level protocol

string ClientString::buildMsg(string message)
  throw(bad_alloc)
{
  broadcast_msg_ = message;
  char_number_ = reinterpret_cast<char*>(message_length_);
  //function to sort char array big endian and create a string from it    
  return(msg_);
}

// Versuch ende


Danke schonmal für eure hilfe!


Search


Bearbeitung von Pablo:

cpp tags gesetzt


Dieser Post wurde am 21.12.2003 um 20:36 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.12.2003, 20:49 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


solltest du mit shiften hinbekommen...

C++:
int main(){
unsigned int x=0x41424344;
for(int i=sizeof(unsigned int);i;--i)printf("%c\t",x>>(8*(i-1)));
}



oder du holst dir die dinger mit nem charpointer....


C++:
char *p=(char*)&x;
//mit *p hast du dann den ersten char wert wert dann immer ++p um den nächsten zu bekommen,




--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 21.12.2003 um 20:57 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.12.2003, 20:52 Uhr
Pablo
Supertux
(Operator)



C++:
unsigned int x = 998;
char buffer[4096];
sprintf(buffer, "%d", x);


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.12.2003, 20:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Pablo
wenn ich ihn richtig verstanden habe will er nicht die zahl in ein char array kopiert haben sondern die direkten werte blos in 8bit häppchen...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.12.2003, 22:19 Uhr
0xdeadbeef
Gott
(Operator)


Die einfachste Möglichkeit wäre, das Ding explizit zu casten und byteweise zu kopieren. Also:

C++:
char *serialize_uint32(char *buf, uint32 x) {
  char *tmp = (char*) &x;
  int i;
  for(i = 0; i < 4; ++i) {
    buf[i] = tmp[i];
  }
  return buf;
}


Allerdings ist das Ergebnis unterschiedlich, je nachdem, welchen Endian die Maschine benutzt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 21.12.2003 um 22:20 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.12.2003, 22:24 Uhr
Pablo
Supertux
(Operator)


Da du das Wort Endian benutzt muss ich an dieser Stelle fragen, was der Unterschied zwischen Litte und big endian ist? Was ist denn das eigentlich?
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.12.2003, 22:28 Uhr
0xdeadbeef
Gott
(Operator)


Die Art und Weise, wie der Wert einer Variablen in Speicher geschrieben wird. Schau mal hier:

www.webopedia.com/TERM/b/big_endian.html
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.12.2003, 22:32 Uhr
Pablo
Supertux
(Operator)


fett, thx.
ich weiß nich, dass es schon mal ein Rätsel darum ging und als ich meinen Kernel gebacken hab, gab es auch diese Eingabe.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.12.2003, 10:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Für Deine Zwecke gibt es doch die nette Einrichtung der Network Byte Order:
ntohl: Wandelt ein Long von Network Byteoder in Hostbyte Oder um
htonl: Wandelt ein Long von Hostbyte Oder in Network Byte Order um.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.12.2003, 10:23 Uhr
(un)wissender
Niveauwart


@virtual

Zitat:

Ich möchte eine Welt, in der ich aus einer Toilette trinken kann, ohne Ausschlag zu bekommen!



Ärzte Fan?
Ist doch aus Friedenspanzer, oder?
--
Wer früher stirbt ist länger tot.
 
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: