gpt4 book ai didi

file - 在 Swift 中,如何将现有二进制文件读入数组?

转载 作者:搜寻专家 更新时间:2023-10-30 21:57:51 25 4
gpt4 key购买 nike

作为我项目的一部分,我有一个二进制数据文件,其中包含大量 32 位整数,我的一个类在初始化时读取这些整数。在我的 C++ 库中,我使用以下初始化程序读取它:

Evaluator::Evaluator() {
m_HandNumbers.resize(32487834);
ifstream inputReader;

inputReader.open("/path/to/file/7CHands.dat", ios::binary);

int inputValue;
for (int x = 0; x < 32487834; ++x) {
inputReader.read((char *) &inputValue, sizeof (inputValue));
m_HandNumbers[x] = inputValue;
}
inputReader.close();
};

在移植到 Swift 时,我决定将整个文件读入一个缓冲区(大约只有 130 MB),然后从缓冲区中复制字节。

所以,我做了以下事情:

public init() {
var inputStream = NSInputStream(fileAtPath: "/path/to/file/7CHands.dat")!
var inputBuffer = [UInt8](count: 32478734 * 4, repeatedValue: 0)
inputStream.open()
inputStream.read(&inputBuffer, maxLength: inputBuffer.count)
inputStream.close()
}

它工作正常,因为当我调试它时,我可以看到 inputBuffer 包含与我的十六进制编辑器所说的相同的字节数组。现在,我想有效地从那里获取数据。我知道它存储在.. 无论你称之为什么格式,最低有效字节在前(即数字 0x00011D4A 在文件中表示为“4A1D 0100”)。我很想手动遍历它并手动计算字节值,但我想知道是否有一种快速方法可以传递 [Int32] 数组并让它读取这些字节。我尝试使用 NSData,例如:

    let data = NSData(bytes: handNumbers, length: handNumbers.count * sizeof(Int32))
data.getBytes(&inputBuffer, length: inputBuffer.count)

但这似乎并没有加载值(所有值仍然为零)。谁能帮我把这个字节数组转换成一些 Int32 值?更好的办法是将它们转换为 Int(即 64 位整数),以保持我的变量大小在整个项目中相同。

最佳答案

不确定您的字节顺序,但我使用了以下函数。与您的代码的不同之处在于使用实际所需类型的 NSRanges,而不是字节长度。此例程一次读取一个值(适用于内容因字段而异的 ESRI 文件),但应该很容易适应。

func getBigIntFromData(data: NSData, offset: Int) -> Int {
var rng = NSRange(location: offset, length: 4)
var i = [UInt32](count: 1, repeatedValue:0)

data.getBytes(&i, range: rng)
return Int(i[0].bigEndian)// return Int(i[0]) for littleEndian
}

关于file - 在 Swift 中,如何将现有二进制文件读入数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28991737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com