2015-08-18 6 views
7

Meine Binärdatei sieht so aus.lesen 32bit Integer aus Binärdatei

00000000: 0000 0803 0000 ea60 0000 001c 0000 001c 
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 

linke Spalte ist Adresse.

Ich habe gerade versucht 0000 0803 (= 2051) zu lesen, wie

ifstream if; 
if.open("file"); 
uint32_t a; 
if >> a; 

folgt wie erwartet ... Es hat nicht funktioniert :-(
a nur 0 nach Ausführung war.
ich long, int, unsigned int, unsigned long versucht. alle gescheitert

Warum diese nicht arbeiten und wie kann ich das Ziel erreichen

+2

Haben Sie überprüfen, ob die Datei korrekt geöffnet wurde? Wie ist der Status des Streams nach dem Lesen? (Fehler oder schlechter Zustand?) –

+2

erinnern über Open-Modus - zweites Argument zu öffnen (http://en.cppreference.com/w/cpp/io/ios_base/openmode). – Hcorg

+1

Und Sie müssen wissen, welche Endianness beim Speichern der Datei verwendet wurde. Little-Endian (z. B. Intel x86): niedrigstwertiges Byte an der niedrigsten Adresse, Big-Endian (z. B. das Internet): höchstwertiges Byte an der niedrigsten Adresse. –

Antwort

12

Sie haben zwei Probleme:.?

  1. Versichern, dass Sie die Bytes lesen, die Sie beabsichtigen (nicht weniger, nicht mehr) aus dem Stream.

    würde ich diese Syntax empfehlen:

    uint32_t a;

    inFILE.read(reinterpret_cast<char *>(&a), sizeof(a));

  2. Versichern Sie diese Bytes mit dem richtigen Byte-Reihenfolge sind zu interpretieren.

    F: Wenn Sie auf einem PC arbeiten, ist Ihre CPU wahrscheinlich little endian. Weißt du, ob dein Datenstrom auch Little-Endian ist oder Big Endian?

    Wenn die Daten Big-Endian ist, würde ich die Standard-Netzwerkfunktionen prüfen, um Byte-Reihenfolge zu empfangen: ntohl(), etc: http://www.retran.com/beej/htonsman.html

AUCH:

Folgen Hcorg der und Daniel Jour Rat: Vergessen Sie nicht den Parameter "Offener Modus" und vergessen Sie nicht, nach "Datei öffnen" -Fehler zu suchen.

+0

Eigentlich gibt es 3 Probleme: Er muss auch die Daten hexadezimal lesen, was wahrscheinlich das größte Problem ist. –

+0

Es wäre besser, einige Gründe für das erste Problem zu erklären. (= Warum empfehlen Sie 'lesen' Funktion, nicht Eingabe-Stream?) – plhn

+2

Warum funktioniert' '' 'nicht? Ist das ein dokumentiertes Verhalten? – zhangxaochen

3

Öffnen Sie die Datei in Binär-Modus und dann read() Methode verwenden, so etwas wie:

uint32_t a; 
ifstream file ("file", ios::in | ios::binary); 
if (file.is_open()) 
{ 
    file.read (&a, sizeof(a)); 
}