如何从文件中提取字节为简单数据类型?
我试过了所有我能想到的东西,并且无法获得任何工作。我有一个在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上不起作用?这件事我真的很茫然。
好吧,我的数据真的很奇怪。我只看了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字节值都来自:那些是INTIAL值字节数组在我放入任何东西之前。由于某种原因该行:
input.read((char*)&tmp[0], 4);
没有做任何事情。任何想法,为什么它不像它应该从文件中读取?
最后编辑:
OK,我大概应该不是答案张贴到这一点,因为它让我看起来很愚蠢,但我不希望任何人阅读这些帖子感到困惑。所以无论怎样,数组和对象总是返回相同的值,这也正是分配给它们的值。我的文件名太多了,所以它试图读出.ipv而不是out.ipv。一旦我修复了文件名,一切都按我预期的方式工作。对不起,感到困惑,并感谢大家的帮助。
这听起来像是一个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
}
我试过了,它仍然给了我没有任何关于原始数字的值。我相信我的问题可能与我在以下新文章中解释的内容更密切相关。 – Davido 2010-12-10 17:47:01
感谢您对问题的解决方案进行跟踪和更新。提供完整的解决方案对于*社区非常有用。一个小挑逗虽然:你应该编辑你的原始问题,提供你试过的东西的更新,而不是发布一个新的“答案”来提供更新。这是一个很好的形式和正常的*练习,可以将问题保留在一起,并且在答案部分只有真正的答案。也就是说,提供你自己的问题答案(就像你对FINAL EDIT所做的那样)是绝对可以的,甚至是值得赞赏的。 – 2010-12-10 20:45:53