首页 > 解决方案 > 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 数组的值

标签: swiftswift4

解决方案


我相信你是在正确的方式

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"

我希望它对你有帮助......祝你好运,让我知道它适用于你的情况。


推荐阅读