在开始之前,如果我说了一些疯狂的话,我想道歉。
我正在开发一个实现 c 库的应用程序。其中,它共享 idArrays。
我有解码 idArray 的部分,它是给我的:
func decodeArrayID(aArray:UnsafeMutablePointer<CChar>, aTokenLen:UInt32)->([UInt32], String){
let arrayCount = Int(aTokenLen / 4)
var idArrayTemp = [UInt32]()
var idArrayStringTemp = ""
for i in 0..<arrayCount{
let idValue = decodeArrayIDItem(index: i, array: aArray)
idArrayTemp.append(idValue)
idArrayStringTemp += "\(idValue) "
}
return (idArrayTemp, idArrayStringTemp)
}
func decodeArrayIDItem(index:Int, array:UnsafeMutablePointer<CChar>) -> UInt32{
var value:UInt32 = UInt32(array[index * 4]) & 0xFF
value <<= 8
value |= UInt32(array [index * 4 + 1]) & 0xFF
value <<= 8
value |= UInt32(array [index * 4 + 2]) & 0xFF
value <<= 8
value |= UInt32(array [index * 4 + 3]) & 0xFF
return value
}
正如我们所见,idArray 是通过 UnsafeMutablePointer 又名 UnsafeMutablePointer 发送的。
现在我正在处理编码部分。该函数将获取一个 UInt32 值数组,并将尝试将其转换为字节数组,并将转换为字符串以通过库发送它。
到目前为止,我有以下代码,但它不起作用:
func encodeIDArray(idArray:[UInt32])->String{
var aIDArray8:[UInt8] = [UInt8]()
for var value in idArray{
let count = MemoryLayout<UInt32>.size
let bytePtr = withUnsafePointer(to: &value) {
$0.withMemoryRebound(to: UInt8.self, capacity: count) {
UnsafeBufferPointer(start: $0, count: count)
}
}
aIDArray8 += Array(bytePtr)
}
let stringTest = String(data: Data(aIDArray8), encoding: .utf8)
return stringTest!
}
输入 [1,2] 的测试结果返回 "\u{01}\0\0\0\u{02}\0\0\0"并且有些地方不太正确...
谢谢
已编辑 c 函数是
DllExport void STDCALL DvProviderAvOpenhomeOrgPlaylist1EnableActionIdArray(THandle aProvider, CallbackPlaylist1IdArray aCallback, void* aPtr);
CallbackPlaylist1IdArray 在哪里
typedef int32_t (STDCALL *CallbackPlaylist1IdArray)(void* aPtr, IDvInvocationC* aInvocation, void* aInvocationPtr, uint32_t* aToken, char** aArray, uint32_t* aArrayLen);
aArray 的值就是得到字节数组的值
最佳答案
我相信你是对的
func encodeIDArray(idArray:[UInt32])->String{
var aIDArray8:[UInt8] = [UInt8]()
for var value in idArray{
let count = MemoryLayout<UInt32>.size
let bytePtr = withUnsafePointer(to: &value) {
$0.withMemoryRebound(to: UInt8.self, capacity: count) { v in
//Just change it to don't return the pointer itself, but the result of the rebound
UnsafeBufferPointer(start: v, count: count)
}
}
aIDArray8 += Array(bytePtr)
}
let stringTest = String(data: Data(aIDArray8), encoding: .utf8)
return stringTest!
}
像这样将您的测试更改为 ASCII 表中的某个有效值
encodeIDArray(idArray: [65, 66, 67]) // "ABC"
希望它对您有所帮助...祝您好运,让我知道它对您的情况有效。
关于swift - UInt32 数组到 Swift 中的字符串字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720171/