如何从文件中提取字节为简单数据类型?

问题描述:

我试过了所有我能想到的东西,并且无法获得任何工作。我有一个在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。一旦我修复了文件名,一切都按我预期的方式工作。对不起,感到困惑,并感谢大家的帮助。

+4

感谢您对问题的解决方案进行跟踪和更新。提供完整的解决方案对于*社区非常有用。一个小挑逗虽然:你应该编辑你的原始问题,提供你试过的东西的更新,而不是发布一个新的“答案”来提供更新。这是一个很好的形式和正常的*练习,可以将问题保留在一起,并且在答案部分只有真正的答案。也就是说,提供你自己的问题答案(就像你对FINAL EDIT所做的那样)是绝对可以的,甚至是值得赞赏的。 – 2010-12-10 20:45:53

这听起来像是一个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 
} 
+0

我试过了,它仍然给了我没有任何关于原始数字的值。我相信我的问题可能与我在以下新文章中解释的内容更密切相关。 – Davido 2010-12-10 17:47:01