作为我的项目的一部分,我有一个二进制数据文件,其中包含大量 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 位整数),以保持我的变量大小在整个项目中相同。