【问题标题】:Converting C char array (unsafe pointer) to String将 C 字符数组(不安全指针)转换为字符串
【发布时间】:2015-10-19 01:37:31
【问题描述】:

我有一个由 CoreFoundation 方法填充的UnsafeMutablePointer<Character>

如果我用 %s 占位符 NSLog 它,它的输出就很好了。

但如果我尝试使用 Swift 的 print,它只会写入内存地址。

几乎尝试了所有方法......我也不明白为什么如果我尝试访问底层的memory 属性,我会得到一个EXC_BAD_ACCESS

let deviceName = UnsafeMutablePointer<Character>.alloc(64)

/* other statements in which deviceName is filled */

NSLog("device %s by %s", deviceName, manufacturerName)
// Outputs correctly the string

print(String(deviceName[0]))
// Get an EXC_BAD_ACCESS error at runtime

print(String(deviceName.memory))
// Get an EXC_BAD_ACCESS error at runtime

let str = withUnsafePointer(&deviceName) { String.fromCString(UnsafePointer($0)) }
print(str)
// Outputs an empty string

print("\(deviceName) by \(manufacturerName)")
// Outputs just memory addresses

【问题讨论】:

  • 能否再显示一些您的代码,好吗?这个指针里有什么,你在做什么,你追求什么结果,当你尝试时会发生什么?
  • 那么我可以假设它实际上是一个 C 字符串吗?
  • @matt 是的,deviceName 实际上是一个 C NUL 终止的字符数组
  • 您尝试了print(deviceName[0]) 却没有收到第一个字母?这让我觉得你根本就没有这个 C 字符串。你不能说明你是如何掌握它的吗?
  • 我希望 C 字符串是 UnsafePointer。我看不出它怎么可能是 UnsafePointer.

标签: swift unsafe-pointers


【解决方案1】:

你似乎不愿意展示你的代码,所以我真的无能为力。但这看起来是错误的:

let deviceName = UnsafeMutablePointer<Character>.alloc(64)
/* other statements in which deviceName is filled */

这不是在 Swift 中获取 C 字符串的方法,如果你认为它在 Swift 中一个 C 字符串,那你就错了;它需要是一个 Int8(C 字符)数组,而不是 Swift Character(一个结构!),才能成为 C 字符串。

换句话说,C char(你的问题的标题)不是 Swift Character - 它们 没有 彼此相似。 C char 是一个小数字,Swift Character 是面向对象语言中的一个对象,C 对此一无所知!

【讨论】:

  • 请阅读上面的评论。如果你愿意,我可以复制整个代码,只是有点长。我报告了填充数组的行。
  • 我已经告诉你你需要知道的了。我不知道 AudioObjectGetPropertyData 做了什么,但世界上不可能提供 Swift Character 的 C 数组。
  • 好的,现在我尝试使用 Int8,打印 deviceName[0] 结果为 66,这是大写 B 的 ascii 代码,用于“内置麦克风”
  • 我相信您现在可以接受我的回答。 :) 剩下的会落在你的腿上。
  • 为了以后的引用,这段代码将生成 Swift 字符串:String.fromCString(deviceName)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多