我想将 Int32
转换为由四个 C 风格的 1 字节宽字符组成的字符串(可能与 this 密切相关,但在 Swift 3 中).
这样做的用途是,Core Audio 的许多 API 函数返回一个 OSStatus
(实际上是一个 Int32
),它通常可以解释为由四个 C- 组成的字符串样式字符。
fun interpretAsString(possibleMsg: Int32) -> String {
// Blackbox
}
最佳答案
实际上“四字符代码”通常是无符号 32 位 值:
public typealias FourCharCode = UInt32
public typealias OSType = FourCharCode
四个字节(从 MSB 到 LSB)各定义一个字符。 这是一个简单的 Swift 3 函数,用于将整数转换为字符串, 受到各种 C/Objective-C/Swift 1+2 解决方案的启发 iOS/C: Convert "integer" into four character string :
func fourCCToString(_ value: FourCharCode) -> String {
let utf16 = [
UInt16((value >> 24) & 0xFF),
UInt16((value >> 16) & 0xFF),
UInt16((value >> 8) & 0xFF),
UInt16((value & 0xFF)) ]
return String(utf16CodeUnits: utf16, count: 4)
}
例子:
print(fourCCToString(0x48454C4F)) // HELO
我选择了一个包含 UTF-16 代码点的数组作为中间存储,因为它可以直接用于创建字符串。
如果你真的需要它作为一个 signed 32 位整数,那么你可以 打电话
fourCCToString(FourCharCode(bitPattern: i32value)
或定义一个采用 Int32
参数的类似函数。
正如 Tim Vermeulen 在下面建议的那样,UTF-16 数组也可以是
使用 map
创建:
let utf16 = stride(from: 24, through: 0, by: -8).map {
UInt16((value >> $0) & 0xFF)
}
或
let utf16 = [24, 16, 8, 0].map { UInt16((value >> $0) & 0xFF) }
除非该功能对您的应用程序性能至关重要, 选择你觉得最熟悉的(否则测量和比较)。
关于ios - Swift 3 - 如何将 Int32 的内存转换为四个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42581256/