Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Hex Zahlen einlesen?

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 <
000
14.12.2005, 21:54 Uhr
~Doug Heffernan
Gast


huhuuu leude,

ich habe eine datei. ca. so: (im hexeditor)

"0A 03 1C 05 12 1B 0D 05 12 08 0A 0C 41 ...
...."


meine.cpp:
...
ifstream dat_ein;
...
dat_ein.open( "Zahlen.dat" , ios_base::in);
...
int dat_z = (int)(dat_length/16);
...
dat_ein.seekg(0, ios_base::beg);
...
char zeichen; // unsigned char ziechen;
dat_ein >> zeichen;
printf("%d\t", zeichen); //oder cout << (int)zeichen << endl;
...

die werte sind als hex "roh" und byteweise. also 0-255, jedes hexPaar steht für einen WERT.
wenn ich zB die datei byte für byte einlese und jedes byte als wert für sich ausgeben will (zB 0A als "10") macht er mir stattdessen einen newline.
ich weiss dass die ersten (ich glaube 30) zeichen nichtdruckbare steuerzeichen sind. aber trotzdem würde ich die gerne als zB short int "weiterverarbeiten"....

kann mir jemand sagen wie ich zB 0A und 0D als 10 bzw. 13 und nicht als NL oder CR ausgebe?
es gab da mal einen trick mit dem quoten?!?!?! aber wie ging der?

ich freue mich über jede anregung - so dann VIELEN DANk im Voraus

----------------------------------------
"Autsch! Rektor Skinner, ich habe mich an einer giftigen Spritze gestochen" - "Such weiter, Bart. Bald stichst du dich am gegenmittel" - oder so
-----
"Pah, Lohnsteuer. Diese Idioten; das habe ich schon letztes Jahr gemacht" - Homer J S
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.12.2005, 10:50 Uhr
virtual
Sexiest Bit alive
(Operator)


Da sind IMHO zwei Dinge zu beachten:
1. Solltest Du die Datei nicht im Textmodus öffnen, sondern im Binary mode. Den textmode nutzt du implizit, wenn Du einen anderen willst, mußt du es sagen:

C++:
dat_ein.open( "Zahlen.dat" , ios_base::in|[b]ios_base::binary[/b]);


Wenn Du nämlich den textmodus verwendest, werden alle Betriebssystemspezisichen Zeilenumbrüche in 0x0a umgewandet. Dies macht zwar keinen Unterschied unter UNIX, wohl aber unter Windows (Da wird CR LF in ein einfaches LF umgewandelt), und unter MacOS sieht es ähnlich aus (da wird glaube ich CR in LF gewandelt, wird dir aber ein MacOSer eher sagen können)

2. Wenn Die Datei gelesen wird (unabh. ob binär oder nicht), dann hast Du die Wahl zwischen Formatierten lesen und unformatierten lesen. Die Verwendung vom >> Operator bedeutet formatiertes Lesen. Wenn Du nichts anderes einstellst, werden auf diese Weise zB die Leerzeichen oder newline garnicht so an dich hochgereicht, wie du es ggf. gerne hättest. Nimm besser eine get methode.

Vielleicht eine kleine Anregung:
www.fun-soft.de/showtopic.php?threadid=3822
--
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
002
15.12.2005, 23:00 Uhr
Hans
Library Walker
(Operator)



Zitat von virtual:
Wenn Du nämlich den textmodus verwendest, werden alle Betriebssystemspezisichen Zeilenumbrüche in 0x0a umgewandet. Dies macht zwar keinen Unterschied unter UNIX, wohl aber unter Windows (Da wird CR LF in ein einfaches LF umgewandelt), und unter MacOS sieht es ähnlich aus (da wird glaube ich CR in LF gewandelt, wird dir aber ein MacOSer eher sagen können)

Hi,

der Mac benötigt das LF nicht, der benutzt für's Zeilenende nur CR.
(Die Umwandelfunktion vom EF-Commander schmeisst jedenfalls alle LF-Zeichen raus, wenn sie einen Text von DOS/Win zum Mac-Format umwandelt.)

Hans,
der sich ein bischen Schleichwerbung nicht verkneifen konnte
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.12.2005, 16:15 Uhr
~Doug Heffernan
Gast


danke erstmal für die antworten!

ok, ich les nun mittels

[cpp]
short int iZahl = dat_ein.get();
[/cpp]

ein. Es klappt - ausser für 0x1A == SUB

ab dem ersten 0x1A gibt er mir nur noch -1 aus [auch für alle die folgenden werte].

aus wiki --> 26 == 0x1A == ^Z == SUB == Substitute == Ersetzen := Steht als Ersatz für ein Zeichen, das ungültig oder fehlerhaft ist. Dateiendezeichen (EOF, End of File)

Ich könnte zwar den fehler evtl. mit:

[cpp]
short int iZahl = (short int)dat_ein.get();
if(iZahl == 26) {
//blabla
}
[/cpp]

zwar abfangen, aber sowas will ich aus effizienzgründen vermeiden.

Lese ich falsch ein? Gibts da eine elegantere methode?

MfG
-----------
Arthur Spooner : "Paschnikiiiiii"
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: