【发布时间】:2014-07-30 16:59:49
【问题描述】:
我考虑了很多类似的问题,但仍然无法让编译器接受这个。
Socket Mobile API(在 Objective-C 中)将 ISktScanDecodedData 传递给 Swift 中的委托方法(数据可能是二进制的,我想这就是它不作为字符串提供的原因):
func onDecodedData(device: DeviceInfo?, DecodedData d: ISktScanDecodedData?) {
let symbology: String = d!.Name()
let rawData: UnsafePointer<UInt8> = d!.getData()
let rawDataSize: UInt32 = decoded!.getDataSize()
// want a String (UTF8 is OK) or Swifty byte array...
}
在 C# 中,此代码将原始数据转换为字符串:
string s = Marshal.PtrToStringAuto(d.GetData(), d.GetDataSize());
在 Swift 中,我可以到达 UnsafeArray,但后来我被卡住了:
let rawArray = UnsafeArray<UInt8>(start: rawData, length: Int(rawDataSize))
另外我看到String.fromCString 和NSString.stringWithCharacters,但它们都不会接受手头的参数类型。例如,如果我可以从 UnsafePointer<UInt8> 转换为 UnsafePointer<()>,那么这将是可用的(尽管我不确定它是否安全):
NSData(bytesNoCopy: UnsafePointer<()>, length: Int, freeWhenDone: Bool)
有没有一种明显的方法可以从这一切中得到一个字符串?
【问题讨论】:
-
想告诉我们
Marshal是做什么的吗?带有d和s的十六进制转储的示例会很棒。 -
@Zaph Marshal 是一个 C# 类,具有用于在各种类型之间进行转换的实用方法,包括从指向数据块的指针到拥有实际字符串的好方法。跨度>
标签: swift type-conversion