Pregunta

He intentado todo lo que puedo pensar y no puedo conseguir algo de trabajo. Tengo un archivo binario que he escrito en VB.Net que básicamente se compone de un número entero, (en binario por supuesto) que me dice que el tamaño de la matriz de los datos siguientes, luego los flotadores como datos binarios. El archivo escribe muy bien desde VB.Net, y puede leer de nuevo a través de Visual C ++ bien usando el siguiente código:

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

Esto devuelve el valor correcto de 456780, los bytes son: 76, 248, 6, 0. Cuando ejecuto el mismo código exacto en mi iPad, me sale 1043089572. Si utilizo el método alternativo a continuación:

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

Este código devuelve un valor diferente, 124.724, y no estoy seguro de cómo leer lo que los bytes son exactas que están siendo sacados del archivo. Eso es otra cosa que yo estaba tratando de averiguar pero no podía conseguir trabajo. Cualquier idea de por qué el mismo método que funciona en Visual C ++ no funcionará en el iPad? Estoy realmente en una pérdida en este caso.

¿Fue útil?

Solución 2

OK, algo muy extraño está pasando con mis datos. Yo miraba a los valores de bytes primas, tanto en Visual C ++ y Objective-C, y que no estoy de acuerdo en absoluto. Yo sólo estoy leyendo los primeros cuatro bytes del archivo y mirando a sus valores. Estoy asumiendo en este punto que yo no los estoy leyendo correctamente, pero no sé lo que me falta aquí. El código de Visual C ++ que estoy usando para mirar a los valores de byte es el siguiente:

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

Los valores de la matriz tmp son:

76
248
6
0

Si hago lo mismo en Objective-C:

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

Puedo obtener:

164
72
44
62

¿Qué ocurre? Me gustaría tener al menos se espera obtener los mismos valores de bytes. El archivo que contiene los cuatro bytes que estoy teniendo problemas con está aquí: newout1 .ipv

EDIT:

Me dio cuenta de dónde los 164,72,44,62 valores de bytes son procedentes de: esos son los valores de la matriz de bytes intial tiene antes de poner cualquier cosa en él. Por alguna razón la línea:

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

no está haciendo nada. Cualquier idea por qué no se leen desde el archivo como debería?

edición final:

OK, yo probablemente no debería publicar la respuesta a esto, ya que me hace parecer muy tonto, pero no quiero que cualquiera que lea estos mensajes a confundirse. Así las matrices y objetos siempre regresaban los mismos valores no importa qué, que también pasó a ser cualquiera de los valores que tenían cuando fueron asignados. Tenía una copa de más. Está en mi nombre, por lo que estaba tratando de leer en lugar de out..ipv out.ipv. Una vez que me fijo el nombre del archivo, todo funcionó exactamente como me esperaba que. Lo siento por la confusión, y gracias por everyones ayuda.

Otros consejos

Esto suena como un problema endian. Puede utilizar cualquiera de las funciones en <libkern/OSByteOrder.h> para leer datos en un orden de bits especificado. En su caso, es posible que desee hacer algo como

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
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top