Domanda

Ho provato tutto quello che posso pensare e non può ottenere nulla per il lavoro. Ho un file binario che ho scritto in VB.Net che fondamentalmente consiste in un intero, (in binario naturalmente) che mi dice la dimensione della matrice per i seguenti dati, quindi i carri come dati binari. Il file scrive bene da VB.Net, e posso leggere di nuovo in tramite Visual C ++ bene utilizzando il seguente codice:

ifstream output("c:\\out.ipv", ios::in | ios::binary);
UInt32 len;
UInt32 *ptr2 = (UInt32*)&len;
output.read((char*)ptr2, 4);

Questo restituisce il valore corretto di 456780, byte sono: 76, 248, 6, 0. Quando eseguo l'esatto stesso codice sul mio iPad, ottengo 1043089572. Se uso il metodo alternativo di seguito:

NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
UInt32 num;
const NSRange numV = {0, 4};
[data getBytes:&num range:numV];

Questo codice restituisce un valore diverso, 124.724, e non sono sicuro come leggere ciò che i byte esatti sono che sono sempre tirati dal file. Quel qualcos'altro che stavo cercando di capire, ma non riuscivo a lavorare. Qualsiasi idea del perché lo stesso metodo che funziona in Visual C ++ non funzionerà sul iPad? Sono davvero in perdita su questo.

È stato utile?

Soluzione 2

OK, qualcosa di veramente strano sta succedendo con i miei dati. Ho appena guardato i valori di byte prime in Visual C ++ e Objective-C, e non sono d'accordo per niente. Sto solo leggendo i primi quattro byte del file e guardando i loro valori. Sto assumendo a questo punto che io non li sto leggendo correttamente, ma non so che cosa mi manca qui. Il codice Visual C ++ che sto usando per guardare ai valori di byte è qui sotto:

ifstream input("c:\\out.ipv", ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);

I valori nella matrice tmp sono:

76
248
6
0

Se faccio la stessa cosa in Objective-C:

ifstream input([filePath UTF8String], ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);

I ottenere:

164
72
44
62

Che cosa dà? Vorrei avere almeno prevede di ottenere gli stessi valori di byte. Il file contenente i quattro byte Sto avendo difficoltà con è qui: newout1 .ipv

EDIT:

mi sono reso conto in cui i valori di byte 164,72,44,62 sono provenienti da: questi sono i valori intial la matrice di byte ha prima di mettere qualsiasi cosa in esso. Per qualche ragione la linea:

input.read((char*)&tmp[0], 4);

non sta facendo nulla. Tutte le idee perché non è la lettura dal file come dovrebbe?

EDIT FINALE:

OK, probabilmente non dovrebbe inviare la risposta a questo dato che mi fa sembrare veramente stupido, ma io non voglio che nessuno la lettura di questi messaggi a confondersi. Così gli array e gli oggetti sono stati sempre tornando gli stessi valori non importa quale, come è accaduto anche per essere qualunque valori che avevano quando sono stati assegnati. Ho avuto uno di troppo. Di nel mio nome, così è stato cercando di leggere in out..ipv piuttosto che out.ipv. Una volta che ho fissato il nome del file, tutto ha funzionato esattamente come mi aspettavo. Ci scusiamo per la confusione, e grazie per tutti quanti aiuto.

Altri suggerimenti

Questo suona come un problema endian. È possibile utilizzare una delle funzioni in <libkern/OSByteOrder.h> per leggere i dati in un endianness specificato. Nel tuo caso, si consiglia di fare qualcosa di simile

NSInputStream *istream = [NSInputStream inputStreamWithFileAtPath:filePath];
UInt32 num = 0;
if (istream) {
    uint8_t buffer[4];
    if ([istream read:buffer maxLength:4] == 4) {
        num = OSReadLittleInt32(buffer, 0);
    } else {
        // there weren't 4 bytes in the file
    }
} else {
    // the file could not be opened
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top