c++ - 如何将文件中的字节提取为简单的数据类型?

标签 c++ objective-c ipad objective-c++ ifstream

我已经尝试了所有我能想到的方法,但仍然无法正常工作。我有一个用 VB.Net 编写的二进制文件,它基本上由一个整数组成(当然是二进制),它告诉我以下数据的数组大小,然后是 float 作为二进制数据。该文件在 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 上无效吗?我真的很茫然。

最佳答案

这听起来像是字节序问题。您可以使用 <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
}

关于c++ - 如何将文件中的字节提取为简单的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404386/

相关文章:

c++ - 我怎样才能用阻塞写入cout?

c++ - 0xC0000005 : Access violation reading location of an Integer?

C++11 线程 - 从类内部启动无限工作线程

ios - NSUndoManager 调用不再存在的方法

c# - 从 C++ ASIO 库用 C# 录制音频流

iphone - 从 View 中移除 tabBar

ios - UITableViewCell 向右滑动触发 Action 或执行 segue

ios - 使用 ARHitTestResult 识别平面的对齐情况?

ios - 寻找适用于 iPad 的开源 PDF 框架

iphone - UIPopoverController 可以在屏幕上移动吗?