【问题标题】:converting String to Data in swift 3.0在 swift 3.0 中将字符串转换为数据
【发布时间】:2016-10-10 19:39:08
【问题描述】:

我正在尝试将字符串转换为数据类型。我认为这就是我所需要的,但如果我尝试打印它,它只会打印“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)
}

我做错了什么?

【问题讨论】:

  • 没有错。顺便.utf8就够了。
  • 参见例如stackoverflow.com/questions/39075043/…,或只是print(newData as NSData)
  • 打印 12 个字节的原因是在 UTF8 中存储 12 个字符需要 12 个字节(ASCII 字符每个字符 1 个字节)。
  • @MartinR as NSData 非常聪明。
  • 我认为您的代码应该可以正常工作...

标签: swift


【解决方案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())

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

如果我的眼睛需要帮助来解析字节

除此之外,我自己也做了很多 BLE 的东西,并且已经为 BLE 东西设计了一些其他有用的数据扩展

【讨论】:

  • 所以听起来self.peripheral?.writeValue(newData, for: positionCharacteristic, type: CBCharacteristicWriteType.withResponse) 应该可以工作。我不知道为什么我在终端上看不到任何东西。我有相反的数据。
  • 你的函数体可以替换为return self.map{ String(format:"%02x", $0) }.joined(separator:separator)
  • 不确定我是否理解失败@lusher00。听起来您的问题不仅仅是“为什么它不向我显示字节本身而不是字节数?”你还期待在哪里看到什么?你指的是哪个终端?
  • 感谢@vadian,已更新。我想我内联它是因为我试图避免任何半字节打印字符串的中间数组。但我从来没有真正测试过它是否比这更聪明。而且我真的没有理由进行早期优化:)
  • 我认为看到字节数是我的失败,但现在似乎不再如此了。我想这确实是我在最初的问题中提出的所有问题,所以我只是将其标记为已回答并继续前进。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
相关资源
最近更新 更多