作为我的项目的一部分,我有一个二进制数据文件,该文件由一系列的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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句