gpt4 book ai didi

swift - Swift 中的指针、指针算法和原始数据

转载 作者:IT王子 更新时间:2023-10-29 05:13:01 25 4
gpt4 key购买 nike

我的应用程序使用了一个有点复杂的不可变数据结构,它被编码在一个二进制文件中。我需要在字节级别访问它,避免任何复制。通常,我会使用 C 或 C++ 指针算法和类型转换来访问和解释原始字节值。我想对 Swift 做同样的事情。

我发现以下方法有效:

class RawData {
var data: NSData!

init(rawData: NSData) {
data = rawData
}

func read<T>(byteLocation: Int) -> T {
let bytes = data.subdataWithRange(NSMakeRange(byteLocation, sizeof(T))).bytes
return UnsafePointer<T>(bytes).memory
}

func example_ReadAnIntAtByteLocation5() -> Int {
return read(5) as Int
}
}

但是,我不确定它的效率如何。 data.subdataWithRangeNSMakeRange 是在我每次调用它们时分配对象,还是它们只是处理指针的语法糖?

在 Swift 中有更好的方法吗?

编辑:

我创建了一个小的 Objective-C 类,它只封装了一个函数来将指针偏移给定的字节数:

@implementation RawDataOffsetPointer

inline void* offsetPointer(void* ptr, int bytes){
return (char*)ptr + bytes;
}

@end

如果我在桥接 header 中包含此类,那么我可以将我的read 方法更改为

func read<T>(byteLocation: Int) -> T {
let ptr = offsetPointer(data.bytes, CInt(byteLocation))
return UnsafePointer<T>(ptr).memory
}

它不会从我的缓冲区复制数据,或分配其他对象。

但是,如果可能的话,从 Swift 中进行一些指针运算仍然会很好。

最佳答案

如果你只想直接做,UnsafePointer<T>可以算术操作:

   let oldPointer = UnsafePointer<()>
let newPointer = oldPointer + 10

你也可以像这样转换一个指针( UnsafePointer<()> 等同于 void * )

   let castPointer = UnsafePointer<MyStruct>(oldPointer)

关于swift - Swift 中的指针、指针算法和原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067085/

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