binaere daten lesen
binaere daten lesen
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.
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.
Re: binaere daten lesen
Hallo Hugenay
Versuchs doch mal mit "man fopen" und "man fread".
mfG Sandro
Versuchs doch mal mit "man fopen" und "man fread".
mfG Sandro
Re: binaere daten lesen
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.
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.
Re: binaere daten lesen
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.
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.
Re: binaere daten lesen
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.
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.
Re: binaere daten lesen
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?
Re: binaere daten lesen
> 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.
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.
Re: binaere daten lesen
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.
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.
Re: binaere daten lesen
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
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
Re: binaere daten lesen
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.
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.
Re: binaere daten lesen
Setze doch einfach wert vor jedem fread() auf 0.Dass sollte schon reichen.
mfG Sandro
mfG Sandro
Re: binaere daten lesen
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.
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.