binaere daten lesen

Post Reply
Message
Author
hugenay

binaere daten lesen

#1 Post by hugenay »

hi,
wie kann ich in C binaere Daten auslesen?

Hintergrund: ich habe ein programm in perl geschrieben, dass mittels unpack und pack daten aus einer Datei extrahiert und in hex, dez und ascii werte "uebersetzt".
Jetzt moechte ich das in C machen. Ich weiss etwa, dass die ersten 4 byte eine hex zahl darstellen. Wie kann ich da vorgehen, welche Bibliothek kann mir helfen?

Ich will auf diesem Wege mich mal wieder an C ranwagen.


gruss hug.

Sandro

Re: binaere daten lesen

#2 Post by Sandro »

Hallo Hugenay

Versuchs doch mal mit "man fopen" und "man fread".

mfG Sandro

hugenay

Re: binaere daten lesen

#3 Post by hugenay »

thx sandro,
dann fehlt aber noch einschritt, wenn ich die manpages richtig verstehe, das ich ja dann die daten erstmal mit nem pointer gezielt ansprechen kann. Wie aber "uebersetze" ich die dann. Oder hab ich was falsch verstanden? Ich hoffe auf ne funktion, die daraufhin direkt in einen hexwert umwandelt (also 0x0a statt bineaeres zeugs)
gruss hug.

Sascha Müller

Re: binaere daten lesen

#4 Post by Sascha Müller »

Für sowas ist printf die beste Lösung. Diese Funktion sollte man sich genau ansehen, da es in anderen Sprachen kaum etwas so mächtiges gibt. Um bspw. einen Integer in der von Dir gewünschten Darstellung anzugeben, würde ich schreibe: <blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">printf("%#06x",a);</font><hr></pre></blockquote>

Das "x" stellt die Zahl hexadezimal dar, "#" sorgt für das "0x" davor, "6" steht für 6 Zeichen breit und "0" füllt führende Nullen auf.

hugenay

Re: binaere daten lesen

#5 Post by hugenay »

hi sascha,
danke, printf ist mir natuerlich ein begriff, aber scheinbar nur marginal. Wenn das a fuer die variable oder den pointer steht, ist das ja genau was ich suche und printf muss echt maechtig sein <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
hab printf jetzt noch nicht genauer nachgelesen, erstmal schlaf nachholgen, aber danke schon mal.

hugenay

Re: binaere daten lesen

#6 Post by hugenay »

zu frueh gepostet. Du schreibst ja von integer. ich hab keine integer, sondern binaere daten, die eine hex zahl darstellen, dann ist printf wohl nicht ganz richtig, oder?

hubert

Re: binaere daten lesen

#7 Post by hubert »

> Du schreibst ja von integer. ich hab keine integer, sondern binaere daten, die eine hex zahl darstellen, dann ist printf wohl nicht ganz richtig, oder?

intern ist sowieso alles binär. hex-, integer-darstellung etc sind ein "feature" des betriebssystems. ist einfach handlicher so und man will das feature schon bald nicht mehr missen.
also einfach mal ausprobieren.

hugenay

Re: binaere daten lesen

#8 Post by hugenay »

Hi,
printf macht die sache schon ganz gut. Aber kleine Problemchen hab ich noch.

das erste byte meiner datei muss 36, das zweite 07 sein.
hexdump zeigt mir:
0724 1234 1234 1234 1234 1234 1234 1234 usw. an.
24 ist dezimal die 36 und 07 ist dezimal natuerlich auch 07. hexdump scheint die nibbles also umgedreht anzuzeigen.
In C jetzt:

int wert;
fread(&wert, 1, 1, file);
printf ("%X
", wert);
fread(&wert, 1, 1, file);
printf ("%X
", wert);

raus kommt dann:
BFFFFB24
BFFFFB07
was machen die bffffb da?


gruss hug.

Sandro

Re: binaere daten lesen

#9 Post by Sandro »

Hi hugenay

Ein int ist unter Linux 32 bit breit,also 4 Byte.Mit fread() liest du ein einzelnes Byte ein,das dann in wert landet.Die anderen 3 Bytes von wert enthalten also Müll.Diesen Müll gibst du mit dem printf()-Aufruf aber aus,da %X einen int und nicht ein byte ausliest.

mfG Sandro

hugenay

Re: binaere daten lesen

#10 Post by hugenay »

ah, danke! Bearbeite ich dass dann mit printf oder sprintf um den Muell rauszufiltern?

Und wie kann ich die nibbles umdrehen, also wenn ich zb 0724 einlese und daraus aber 2407 machen will? Per regex?
Ich sollte mir vielleicht mal ein umfassendes Buch zu legen, Fragen ueber Fragen.
gruss hug.

Sandro

Re: binaere daten lesen

#11 Post by Sandro »

Setze doch einfach wert vor jedem fread() auf 0.Dass sollte schon reichen.

mfG Sandro

hugenay

Re: binaere daten lesen

#12 Post by hugenay »

Hi,
auf 0 setzen war ein guter Tipp.
Wenn ich jetzt aber mehr als 1 Byte einlese, werden sie falsch eingelesen. Statt 00d7 kommt d700, in Perl wuerde ich dann z.B. jeweils ein Byte einlesen und diesen dann als String zusammenfuegen (.=). Wie wuerde man in C vorgehen?
gruss hug.

Post Reply