【问题标题】:Swift get data from UnsafeMutablePointer<Int8>Swift 从 UnsafeMutablePointer<Int8> 获取数据
【发布时间】:2018-05-11 07:22:56
【问题描述】:

我有一个像下面这样的 objc 函数

-(char *)decrypt:(char *)crypt el:(int)el{}

当我从 swift 调用此函数时,它返回 UnsafeMutablePointer&lt;Int8&gt;。现在我需要从这个指针中获取数据。输出应该是这样的字符串

“5c9f2cb88787fff26ca8a57982604460201805111017510011111111”

我尝试了下面的代码来检索值

String(validatingUTF8: pointer)

但它返回 nil。 我如何从这个UnsafeMutablePointer&lt;Int8&gt;?获得价值

【问题讨论】:

  • char *指向的数据是什么格式的?是 UTF-8 还是原始二进制数据(因为您的示例字符串仅使用可能是十六进制数字的字符)?它是否以空值终止?
  • 最好的猜测是数据不是有效的 UTF-8 字符串。查看十六进制表示并验证它是否有效或使用String(validatingUTF8: pointer),其中非 UTF-8 值将显示为 unicode 错误符号:�。如果解密失败,则结果很可能是无效的 UTF-8。

标签: ios objective-c swift unsafe-pointers


【解决方案1】:

最好的猜测是数据不是有效的 UTF-8 字符串。

如果解密失败,则结果很可能是无效的 UTF-8,但这只是一个诊断。

查看十六进制表示并验证它是否有效或使用String(validatingUTF8: pointer),其中非 UTF-8 值将显示为 unicode 错误符号:�.

【讨论】:

    【解决方案2】:

    我将在这里冒险并假设您的 char * 实际上并不指向 UTF-8 数据,而是指向您希望获得十六进制表示的原始二进制数据。您可以通过以下方式做到这一点:

    // You'll need to know the length of the data. If it's null-terminated,
    // read through the pointer until you hit a zero byte; otherwise, use whatever
    // facility the API you're using provides to get the data length.
    let buffer = UnsafeBufferPointer(start: $0, count: __insert_length_here__)
    
    // and so:
    let hexString = buffer.reduce(into: "") { $0 += String(format: "%02x", $1) }
    
    print(hexString) // ta da!
    

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多