2016-12-16 3 views
2

я получаю массив с байтами:Преобразовать байты в строку не работает

var requestPtr = [3, 64, 0, 73, 0, 110, 0, 116, 0, 101, 0, 114, 0, 110, 0, 97, 0, 108, 0, 32, 0, 70, 0, 108, 0, 97, 0, 115, 0, 104, 0, 32, 0, 32, 0, 47, 0, 48, 0, 120, 0, 48, 0, 56, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 47, 0, 48, 0, 52, 0, 42, 0, 48, 0, 49, 0, 54, 0, 75, 0, 103, 0, 44, 0, 48, 0, 49, 0, 42, 0, 48, 0, 54, 0, 52, 0, 75, 0, 103, 0, 44, 0, 48, 0, 55, 0, 42, 0, 49, 0, 50, 0, 56, 0, 75, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

Затем удалите первые байты и преобразовать массив в строку с этим кодом:

requestPtr.remove(at: 0) 

let nsdata = NSData(bytes: requestPtr, length: requestPtr.count) 
var str = String(data: nsdata as Data, encoding: String.Encoding.utf8)! 

Если я бы напечатать в консоли он возвращается me string: enter image description here Но я получаю странное кодирование при попытке скопировать сообщение.

enter image description here

И такие функции, как str.hasPrefix("@Internal Flash") не работает.

И возвращается:

["\u{03}@\0I\0n\0t\0e\0r\0n\0a\0l\0 \0F\0l\0a\0s\0h\0 \0 \0", "\00\0x\00\08\00\00\00\00\00\00\0", "\00\04\0*\00\01\06\0K\0g\0,\00\01\0*\00\06\04\0K\0g\0,\00\07\0*\01\02\08\0K\0g\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"] 

ответ

0

Вы recevie массив байт, но только каждый второй байт является правильным

попробовать это:

let test = String(requestPtr.enumerated().filter{ index, element in 
    return index % 2 == 1 
}.map { index, element in 
    return Character(UnicodeScalar(element)!) 
}) 

Они, вероятно, лучшие решения, но ничего приходит на ум

+0

спасибо. Ваше решение работает. Не могли бы вы объяснить это, пожалуйста, – Arti

+0

Я могу попробовать, но мне нужна ваша функция для получения байтов –

+0

i получить байты с устройства usb: '' 'var request = IOUSBDevRequest (bmRequestType: 128, bRequest: 6, wValue: 0x300 | UInt16 (index) , wIndex: 0, wLength: 255, pData: & requestPtr, wLenDone: 255) kr = deviceInterface.DeviceRequest (deviceInterfacePtrPtr, & request) '' ' – Arti

1

Кажется, что данные закодированы в UTF-16LE (малоконечный UTF-16), а не в UTF-8.

(код обновлен уточнить, с тем, что данные я получил результат, показанный.)

var requestPtr = [3, 64, 0, 73, 0, 110, 0, 116, 0, 101, 0, 114, 0, 110, 0, 97, 0, 108, 0, 32, 0, 70, 0, 108, 0, 97, 0, 115, 0, 104, 0, 32, 0, 32, 0, 47, 0, 48, 0, 120, 0, 48, 0, 56, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 47, 0, 48, 0, 52, 0, 42, 0, 48, 0, 49, 0, 54, 0, 75, 0, 103, 0, 44, 0, 48, 0, 49, 0, 42, 0, 48, 0, 54, 0, 52, 0, 75, 0, 103, 0, 44, 0, 48, 0, 55, 0, 42, 0, 49, 0, 50, 0, 56, 0, 75, 0, 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

requestPtr.remove(at: 0) 

let data = Data(bytes: requestPtr.map{UInt8($0)}) 
var str = String(data: data, encoding: String.Encoding.utf16LittleEndian)!.trimmingCharacters(in: CharacterSet(charactersIn: "\0")) 

debugPrint(str) //->"@Internal Flash /0x08000000/04*016Kg,01*064Kg,07*128Kg" 

(Фактические данные говорят [UInt8], но .map{UInt8($0)} делает это.)

+0

как вы обнаруживаете кодировку? это не работает '' '' 䀃 䤀 渀 琀 攀 爀 渀 愀 氀 䘀 氀 愀 猀 栀 ⼀ 砀 㠀 ⼀ ⨀ ⨀ ㄀ 㘀 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 最 – Arti

+0

UTF-16LE - один из возможных кандидатов для интерпретации последовательности байтов. И, пожалуйста, объясните, как вы понимаете, что это не работает. – OOPer

+0

@Arti, я нашел его. Вы пробовали мой код без вашего 'requestPtr.remove (at: 0)'. Попробуйте мой код после 'requestPtr.remove (at: 0)'. – OOPer

1

Там необходимо определить массив байтов типа [UInt8]. Ниже упомянуты будет работать и возвращать True

var requestPtr:[UInt8] = [3, 73, 110, 116, 101, 114, 110, 97, 108, 32, 70, 108, 97, 115, 104] requestPtr.remove(at: 0) print(requestPtr.count) print(requestPtr) let nsdata = NSData(bytes: requestPtr as [UInt8], length: requestPtr.count) var str = String(data: nsdata as Data, encoding: String.Encoding.utf8)! str.hasPrefix("Internal Flash")

+0

yes '' 'var requestPtr: [UInt8]' '' is by array array – Arti

+0

@Arti в вашем исходном массиве кода определяется с неявным преобразованием типа, из-за которого он преобразуется по-разному, когда массив байтов преобразуется в NSData , В моем ответе массив байтов байтов явно определяется как массив UInt8. –

+0

Хорошо, я понимаю спасибо – Arti

Смежные вопросы