1

我已经尝试了所有我能想到的东西,但没有任何效果。我有一个我在 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 上不起作用吗?我真的在这个方面不知所措。

4

2 回答 2

1

这听起来像一个字节序问题。您可以使用任何函数<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
}
于 2010-12-10T00:01:49.960 回答
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);

没有做任何事情。任何想法为什么它没有像应该的那样从文件中读取?

最终编辑:

好的,我可能不应该发布这个答案,因为它让我看起来很愚蠢,但我不希望任何阅读这些帖子的人感到困惑。因此,无论如何,数组和对象总是返回相同的值,这也恰好是它们在分配时所具有的任何值。我的文件名中有一个太多的 .,所以它试图读入 out..ipv 而不是 out.ipv。一旦我修复了文件名,一切都完全按照我的预期工作。很抱歉造成混乱,并感谢大家的帮助。

于 2010-12-10T17:39:06.960 回答