преобразование строки в данные в Swift 3.0

Я пытаюсь преобразовать строку в тип данных. Я думал, что это все, что мне нужно, но если я попытаюсь напечатать его, он просто напечатает «12 байт».

let tString = "Hello World!"
if let newData = tString.data(using: String.Encoding.utf8){
    print(newData)
    self.peripheral?.writeValue(newData, for: positionCharacteristic, type: CBCharacteristicWriteType.withResponse)
}

Что я делаю не так?


person lusher00    schedule 10.10.2016    source источник
comment
Нет ничего плохого. Кстати, .utf8 достаточно.   -  person vadian    schedule 10.10.2016
comment
См., например, stackoverflow.com/questions/39075043/ или просто print(newData as NSData).   -  person Martin R    schedule 10.10.2016
comment
Причина, по которой он печатает 12 байтов, заключается в том, что для хранения 12 символов в UTF8 требуется 12 байтов (1 байт на символ для символов ASCII).   -  person Kevin Sylvestre    schedule 10.10.2016
comment
@MartinR as NSData довольно умен.   -  person vadian    schedule 10.10.2016
comment
Я предполагаю, что ваш код должен работать нормально...   -  person Ahmad F    schedule 10.10.2016


Ответы (1)


Вы не делаете ничего плохого. Именно так Data в настоящее время делает свою отладочную распечатку. Он изменился со временем. Иногда он печатался больше как NSData. В зависимости от формата отладочной печати довольно хрупкий, я думаю, что лучше просто владеть им более напрямую. Я нашел следующее довольно полезным:

extension Data {
    func hex(separator:String = "") -> String {
        return (self.map { String(format: "%02X", $0) }).joined(separator: separator)
    }
}

Это позволяет мне заменить ваш простой print(newData) чем-то вроде

print(newData.hex())

or

print(newData.hex(separator:"."))

если моим глазам нужна помощь в разборе байтов

Кроме того, я сам немного занимаюсь BLE и разработал ряд других полезных расширений данных для BLE

person Travis Griggs    schedule 10.10.2016
comment
Так что, похоже, self.peripheral?.writeValue(newData, for: positionCharacteristic, type: CBCharacteristicWriteType.withResponse) должно работать. Я не уверен, почему я ничего не вижу в своем терминале. У меня данные идут в другую сторону. - person lusher00; 10.10.2016
comment
Тело вашей функции можно заменить на return self.map{ String(format:"%02x", $0) }.joined(separator:separator) - person vadian; 10.10.2016
comment
Не уверен, что понимаю провал @lusher00. Похоже, ваш вопрос больше, чем почему он не показывает мне сами байты вместо количества байтов? Что еще вы ожидаете увидеть, где? Какой терминал вы имеете в виду? - person Travis Griggs; 10.10.2016
comment
Спасибо @vadian, обновлено. Я думаю, что встроил его, потому что пытался избежать любого промежуточного массива печатных строк. Но я никогда не проверял, не умнее ли он. И у меня действительно не было оснований для ранней оптимизации :) - person Travis Griggs; 10.10.2016
comment
Я думал, что просмотр количества байтов был моей ошибкой, но, похоже, это уже не так. Я думаю, это действительно все, что я задал в своем первоначальном вопросе, поэтому я просто отмечу это как ответ и продолжу. Спасибо. - person lusher00; 10.10.2016