【问题标题】:After converting from Int to Hex value and then Append hex value to the Data object getting error Swift?从 Int 转换为 Hex 值,然后将 hex 值附加到 Data 对象后出现错误 Swift?
【发布时间】:2018-07-30 15:54:24
【问题描述】:

在尝试附加数据对象转换为十六进制值后,我有如下代码,但它给了我以下错误:

在展开可选值时意外发现 nil

let n = 585
let result = 255 - n % 256 //182 is result
let hexValue = String(result, radix: 16) //b6 is result
var returnMsg = "[1,1,1, ,#00300".data(using: .utf8) as! Data
returnMsg.append(UInt8(hexValue)!)

我在这里尝试将 b6 添加到数据对象。

【问题讨论】:

  • 一些想法:let intValue = UInt8("b6") 这将返回nil。这似乎合乎逻辑。这就是它崩溃的原因,因为那时UInt8(hexValue) 为零,并且您使用! 强制对其展开。你为什么使用String?只做returnMsg.append(result) 怎么样?但是现在出现了一个问题,因为您不能像这样将 Int (UInt8) 附加到 Data 对象。
  • 我无法复制该问题。在将代码的前四行添加到新项目的viewDidLoad 并添加一个简单的print(returnMsg) 后产生“15 个字节”,但在append 上编译错误。但是...我现在看到一个左引号(对于字符串?)可能放错了位置,并且在它里面有一个左括号(对于一个数组?)没有右引号。你有没有机会错误发布你的代码?总而言之,"[1,1,1, ,#00300".data(using: .utf8)" 在语法上正在编译,但没有(至少是右括号。

标签: swift hex decimal nsdata


【解决方案1】:

您使用字符串将result 作为十六进制字符串附加到returnMsg 是没有用的。只需附加result

let n = 585
let result = 255 - n % 256 //182 is result
var returnMsg = "[1,1,1, ,#00300".data(using: .utf8)!
returnMsg.append(UInt8(result))

您的崩溃是由强制展开UInt8(hexValue) 引起的。传入字符串b6 会给出nil 结果,而nil 的强制展开总是会导致崩溃和您看到的错误消息。接受字符串的 UInt8 初始化程序仅接受以 10 为底的整数。您可以在文档中看到这一点:

作为description 传递的字符串可以以加号或减号字符(+ 或-)开头,后跟一个或多个数字(0-9)。

如果description 的格式无效,或者它表示的以10 为底的值不可表示,则结果为nil

【讨论】:

  • 我明白这一点并感谢您的提示.. 但这里 182 是十进制值,您直接附加十进制值,但我需要附加十六进制值而不是那个...
  • 也许你问错了问题。您希望附加字节值 182 (b6) 还是附加字符串 b6 的 UTF8 编码字节?这两个选择之间有很大的不同。此答案假设您希望添加一个字节 182 (b6)。
  • 感谢您的澄清..我正在尝试将 182 的字节值以十六进制格式添加到数据中..
  • 那我的答案就是你想要的。一个字节就是一个字节。该格式仅在向用户显示时才相关。无需将任何内容转换为十六进制来附加字节。
  • 谢谢..我们正在将该数据发送到物联网设备,而期望十六进制格式的设备..会清楚地询问他们,如果他们想要十六进制格式,我需要找到另一种方式..!跨度>
猜你喜欢
  • 2016-03-23
  • 1970-01-01
  • 2011-06-02
  • 2015-11-18
  • 1970-01-01
  • 2014-04-17
  • 2018-07-22
  • 2013-12-02
  • 2015-06-16
相关资源
最近更新 更多