Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » binär datei lesen und als hex word ausgeben

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.06.2008, 16:39 Uhr
Campeon



Hallo

Ich möchte eine Binär Datei lesen und als hex Wert mit 16 bit (0xFFFF) ausgeben (später auch mit den Werten weiter rechnen ...)

Im Moment ist aber das low byte mit dem high byte vertauscht!

Kann mir jemand sagen warum?

C++:
#define MAXBUF 65536 /* Puffergroesse */

char main(int argc, char *argv[]) {

    unsigned short buffer[MAXBUF];  /* input buffer */
    FILE *rf;                       /* read file */
    unsigned long numread;          /* no. of read values */

    if (argc<2) {
        printf("Binary input file required.\n");
        return (1);
    }
    if ((rf = fopen(argv[1], "rt")) == NULL) {
        printf("ERROR: could not read input file\n");
        exit(1);
    }

    do {
        numread = fread(buffer, sizeof(unsigned short), MAXBUF, rf);
    } while (numread > 0);

    fclose(rf);

    for (i=0; i<=lenght; i++) {
        printf("0x%04x\n", buffer[i]);
    }

  return 0;
}



Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt. Nächstes mal selbst machen.


Dieser Post wurde am 14.06.2008 um 17:03 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.06.2008, 17:04 Uhr
0xdeadbeef
Gott
(Operator)


Das wird am Endian liegen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.06.2008, 18:37 Uhr
~Campeon
Gast


Hallo 0xdeadbeef,

Danke erst mal für deine schnelle Antwort.
Mir ist nun soweit klar dass die Byte-Reihenfolge vertauscht ist. Ist dass nur ein Ausgabeproblem, d.h. die Daten liegen im Speicher richtig vor um mit ihnen zu arbeiten? Wie kann ich dieses Problem beheben. Macht dass die Funktion htons()? Wenn ja wie verwende ich sie?

Meine C-Kenntnisse liegen schon eine Weile zurück und waren auch noch nie überragend!!!

PS: Danke fürs cpp-tag einfügen (bin wohl auch kein begabter Forum Nutzer) ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.06.2008, 20:48 Uhr
0xdeadbeef
Gott
(Operator)


Heh. Die Daten liegen so im Speicher, wie der Prozessor sie verarbeiten kann, in deinem Fall little endian. htons konvertiert einen 16-bit-Integer (uint16_t) nach Netzwerk-Endian, d.h. big endian. Wenn es das ist, was du willst,

C++:
#include <arpa/inet.h> // ntohs etc.
#include <stdint.h> // uint16_t etc.

// ...

uint16_t x = 123; y;

y = htons(x);


Ich würde auch dein Array explizit auf uint16_t umstellen. Zwar ist auf den meisten heute gängigen Plattformen unsigned short 16 bit lang, aber der C-Standard garantiert das nicht, und es kann sich in der Zukunft locker auch mal ändern - so geschehen mit int auf x86-64-Maschinen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: