swift - UInt32 数组到 Swift 中的字符串字节数组

标签 swift swift4

在开始之前,如果我说了一些疯狂的话,我想道歉。

我正在开发一个实现 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/

相关文章:

ios - UIButton 上的操作不起作用

ios - 本地通知不在 swift 4 中调用 didReceiveRemoteNotifications

ios - UICollctionView 没有快速加载数组值

swift - Alamofire,对象映射器, Realm : Delete orphaned objects

ios - 更改自定义颜色的边框颜色

swift - CoreML 图像检测

swift - iOS 中的 Collection View

iOS 如何优化数据库查询 Parse swift 4

Swift4 - 强制解开使用 TimeZone.current.abbreviation() 返回的缩写是否安全?

Swift 4 可解码 : How to map multiple values to a single enum value?