swift - UInt32 数组到 Swift 中的字符串字节数组
问题描述
在我开始之前,如果我说了一些疯狂的话,我想道歉。
我正在开发一个实现 ac 库的应用程序。其中,它共享 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 AKA 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 的值是获取 Byte 数组的值
解决方案
我相信你是在正确的方式
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"
我希望它对你有帮助......祝你好运,让我知道它适用于你的情况。
推荐阅读
- python - 如何构建指向已保存的 python 回溯的异常?
- python - 用glom怎么说“收集所有”?
- jquery - 如何将自定义参数传递给 jQuery AJAX 方法的回调方法?
- javascript - 尝试访问 hypixel api 中的“pricePerUnit”时,出现错误:TypeError: Cannot read property 'pricePerUnit' of undefined
- javascript - 如何让 Puppeteer 基于 page.$eval 函数在 PDF 中渲染 MathJax?
- javascript - 数据库中的数据未返回
- python - 如何从另一个python文件运行函数
- java - 卸载应用程序时,内部存储“getFilesDir()”中的文件不会被删除
- html - 使用 iframe 嵌入网站时出现拒绝连接错误
- c# - 当来自 URL 的 XML 被中断时 C# 挂起代码