CoderZ.cc

Zurück   CoderZ.cc > Programmierung > C & C++ > C & C++ Hilfe


 
Themen-Optionen Ansicht
10.12.2013, 02:39   #1
dr.pepper (Offline)
Second Level User
 
 
Registriert seit: 27.11.2024
Ort: Dr. Freds Labor
Beiträge: 132
Thanks: 25
Thanked 44 Times in 25 Posts
Standard [F][C++] cout + hex

ich möche mit C++ gerne den Entrypoint einer ELF-Datei als Hex-Wert darstellen.
Mit
printf( "- Entrypoint: 0x%X \n", ehdr.e_entry );
funktioniert das auch, allerdings möchte ich eigentlich lieber cout verwenden.

Wenn ich
cout <<"- Entrypoint: "  << ehdr.e_entry << endl;
versuche bekomme ich: Entrypoint: 134519334


und beim verwenden von stringstream:
stringstream entry2;
entry2 << hex << ehdr.e_entry;
cout <<"[*] Old Entrypoint: "  << entry2 << endl;
wird mir ein anderer Wert als mit der printf-Funktion angezeigt:
printf: 0xBFB6F9D0 
stringstream: 0xbfb6f914
Jemand eine Idee woran das liegen kann?
__________________
[ May the Source be with you ]
  Mit Zitat antworten
10.12.2013, 08:34   #2
kiddy (Offline)
Coderz Mitglied
 
Registriert seit: 20.10.2024
Beiträge: 17
Thanks: 13
Thanked 9 Times in 4 Posts
kiddy eine Nachricht über ICQ schicken
Standard

entry2.str()
__________________
Nicht verpassen zu joinen!

IRC: irc.seilen.de / #coderz.cc
  Mit Zitat antworten
10.12.2013, 16:35   #3
dr.pepper (Offline)
Second Level User
 
 
Registriert seit: 27.11.2024
Ort: Dr. Freds Labor
Beiträge: 132
Thanks: 25
Thanked 44 Times in 25 Posts
Standard

Zitat von kiddy
entry2.str()
nope, das löst das Problem nicht.
__________________
[ May the Source be with you ]
  Mit Zitat antworten
10.12.2013, 18:33   #4
neitec (Offline)
Moderator
 
Registriert seit: 17.03.2025
Beiträge: 71
Thanks: 59
Thanked 14 Times in 11 Posts
Standard

Ich kann mir nicht vorstellen, dass das Problem bei printf/string liegt. Vielleicht wird der Wert in deinem Code ungewollt modifiziert? Wirf doch mal den Debugger an

unsigned val = 0xbfb6f914;
printf("printf: %x\n", val);
cout << "cout: " << hex << val << endl;
printf: bfb6f914
cout: bfb6f914
__________________
IRC irc.rizon.net CHANNEL #coderz.cc
  Mit Zitat antworten
10.12.2013, 18:51   #5
dr.pepper (Offline)
Second Level User
 
 
Registriert seit: 27.11.2024
Ort: Dr. Freds Labor
Beiträge: 132
Thanks: 25
Thanked 44 Times in 25 Posts
Standard

Ich denke eher das es an der Umwandlung in Hex liegt.
ehdr.e_entry ergibt bei normaler Ausgabe einen Dezimalwert:
cout <<  ehdr.e_entry << endl;
3217325056
Dieser umgewandelt in Hex ergibt: bfc47c00 und das ist auch das gleiche was mir printf angezeigt hat (Entrypoint: 0xBFC47C00).

Da stelt sich nun die Frage, was bei der Umwandlung in Hex falsch läuft, bzw. welche Funktion funktioniert.

Bzw. bin ich mir über den Typ e_entry von nicht ganz im klaren.
Der Wert kommt aus dem struct typedef struct elf32_hdr{ und ist dort definiert als
Elf32_Addr      e_entry; /* Entry point */
e entry gibt den Einsprungpunkt im virtuellen Speicher an, an dem die Ausführung beginnt, nachdem das Programm geladen und im Speicher platziert worden ist.
__________________
[ May the Source be with you ]

Geändert von dr.pepper (10.12.2024 um 19:03 Uhr)
  Mit Zitat antworten
14.12.2013, 23:12   #6
inherited (Offline)
Coderz Mitglied
 
Registriert seit: 26.06.2024
Ort: bw
Beiträge: 345
Thanks: 17
Thanked 53 Times in 35 Posts
Standard

du laesst bei deinem printf() aufruf das %X durch deine zahl ersetzen. siehe c referenz
wenn du das %X in ein %d aenderst, so bekommst du das selbe wie mit cout.
cout weiß ja nicht, das du die zahl in hex dezimaler darstellung ausgegeben haben willst, ehdr.e_entry ist ja bloß eine zahl. ich bin kein c-ler, daher kenne ich aus dem stehgreif keine funktion die das kann.
fprintf() oder fwrite() - es muss irgendwas in der richtung geben wo das kann, ich kenne mich da zu wenig aus :o)

wenn du tatsaechlich mit printf() einen pointer ausgegeben haben willst, dann ist %p besser als %X
  Mit Zitat antworten
15.12.2013, 00:53   #7
Domenic (Offline)
Moderator
 
Registriert seit: 12.06.2024
Beiträge: 42
Thanks: 15
Thanked 13 Times in 8 Posts
Domenic eine Nachricht über ICQ schicken
Standard

du laesst bei deinem printf() aufruf das %X durch deine zahl ersetzen. siehe c referenz
Genau, dabei wird die Zahl aber in hexadezimal Form ausgegeben und genau das möchte er ja auch.
wenn du das %X in ein %d aenderst, so bekommst du das selbe wie mit cout.
Falls das so sein sollte, dann wurde in seinem C++ Code in den output stream kein manipulator geschrieben, denn in C formatiert %d die Ausgabe als Dezimal.
cout weiß ja nicht, das du die zahl in hex dezimaler darstellung ausgegeben haben willst, ehdr.e_entry ist ja bloß eine zahl. ich bin kein c-ler, daher kenne ich aus dem stehgreif keine funktion die das kann.
Genau dafür gibt es in C++ Manipulatoren und in C format-Funktionen mit den entsprechenden Formatierungszeichen.
fprintf() oder fwrite() - es muss irgendwas in der richtung geben wo das kann, ich kenne mich da zu wenig aus :o)
Beide Funktionen schreiben in Dateien.


Wenn ich ehrlich bin verstehe ich das Problem nicht ganz. Da kann ich neitec nur Recht geben, sowohl std::cout als auch printf ergeben bei mir keine Fehler. Siehe hier: http://ideone.com/GxvN3U
  Mit Zitat antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:55 Uhr.

Powered by vBulletin®
Copyright ©2008 - 2017
Template-Modifikationen durch TMS