我已经尝试了所有我能想到的东西,无法让任何事情发挥作用。我有一个用VB.Net编写的二进制文件,它基本上由一个整数(当然是二进制)组成,告诉我下面数据的数组大小,然后将浮点数作为二进制数据。该文件从VB.Net写得很好,我可以通过Visual C ++将其读回来,使用以下代码:
ifstream output("c:\\out.ipv", ios::in | ios::binary);
UInt32 len;
UInt32 *ptr2 = (UInt32*)&len;
output.read((char*)ptr2, 4);
这将返回正确的值456780,字节为:76,248,6,0。当我在iPad上运行完全相同的代码时,我得到1043089572.如果我使用下面的替代方法:
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
UInt32 num;
const NSRange numV = {0, 4};
[data getBytes:&num range:numV];
此代码返回一个不同的值124724,我不知道如何读取从文件中提取的确切字节数。这是我试图找出的其他东西,但无法正常工作。知道为什么在Visual C ++中使用相同的方法无法在iPad上运行吗?我真的很茫然。
答案 0 :(得分:1)
这听起来像是一个endian问题。您可以使用<libkern/OSByteOrder.h>
中的任何函数来读取指定字节序的数据。在您的情况下,您可能想要执行类似
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
}
答案 1 :(得分:1)
好的,我的数据正在发生一些奇怪的事情。我只是看了Visual c ++和objective-c中的原始字节值,他们根本不同意。我只是读取文件的前四个字节并查看它们的值。我在这一点上假设我没有正确阅读它们,但我不知道我在这里缺少什么。我用来查看字节值的Visual C ++代码如下:
ifstream input("c:\\out.ipv", ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);
tmp数组中的值为:
76
248
6
0
如果我在objective-c中做同样的事情:
ifstream input([filePath UTF8String], ios::in | ios::binary);
Byte tmp[4];
input.read((char*)&tmp[0], 4);
我明白了:
164
72
44
62
是什么给出的?我至少期望获得相同的字节值。包含我遇到问题的四个字节的文件位于:newout1.ipv
编辑:
我意识到164,72,44,62字节值的来源:这是Byte数组在放入任何内容之前的初始值。由于某种原因,该行:
input.read((char*)&tmp[0], 4);
没有做任何事情。任何想法,为什么它不是从文件中读取它应该?
最终编辑:
好吧,我可能不应该发布答案,因为它让我看起来很愚蠢,但我不希望读这些帖子的人感到困惑。因此,无论如何,数组和对象总是返回相同的值,这也恰好是分配时的值。我有一个太多了。我的文件名,所以它试图读出..ipv而不是out.ipv。一旦我修改了文件名,一切都完全符合我的预期。对不起,感谢大家的帮助。