Прежде чем начать, я хотел бы извиниться, если скажу что-нибудь сумасшедшее.
Я работаю над приложением, которое реализует библиотеку 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 - это значение, которое получает массив байтов