我想一个Int32
转换成由四个C风格的字符串,1字节宽字符(可能是密切相关的this但斯威夫特3)。斯威夫特3 - 如何为Int32记忆转化为四个字符
这样做的用途是Core Audio的许多API函数返回一个OSStatus
(实际上是一个Int32
),它通常可以解释为由四个C样式字符组成的字符串。
fun interpretAsString(possibleMsg: Int32) -> String {
// Blackbox
}
我想一个Int32
转换成由四个C风格的字符串,1字节宽字符(可能是密切相关的this但斯威夫特3)。斯威夫特3 - 如何为Int32记忆转化为四个字符
这样做的用途是Core Audio的许多API函数返回一个OSStatus
(实际上是一个Int32
),它通常可以解释为由四个C样式字符组成的字符串。
fun interpretAsString(possibleMsg: Int32) -> String {
// Blackbox
}
我没有测试此代码,但试试这个:
func interpretAsString(possibleMsg: Int32) -> String {
var result = String()
result.append(Character(UnicodeScalar(UInt32(possibleMsg>>24))!))
result.append(Character(UnicodeScalar(UInt32((possibleMsg>>16) & UInt32(0xFF)))!))
result.append(Character(UnicodeScalar(UInt32((possibleMsg>>8) & UInt32(0xFF)))!))
result.append(Character(UnicodeScalar(UInt32((possibleMsg) & UInt32(0xFF)))!))
return result
}
其实 “四个字符代码” 通常是一个无符号位 值:
public typealias FourCharCode = UInt32
public typealias OSType = FourCharCode
四个字节(从MSB到LSB)各自定义一个字符。 下面是一个简单迅捷3功能的整数转换为字符串, 由各个C /目标C /夫特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代码点作为中间存储的数组,因为它可以直接用来创建一个字符串。
如果你真的需要它的签署 32位整数,那么你可以 电话
fourCCToString(FourCharCode(bitPattern: i32value)
或定义类似函数获取Int32
参数。
作为添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) }
除非功能是应用程序的性能关键, 拾取你最熟悉的东西(否则测量和比较)。
我通常使用'UInt16(UInt8.max)'而不是有点神奇的'0xFF',但我想这是一个经验问题。我也建议使用'map'来创建'chars'数组,它会为您节省一些时间在您最后的编辑:) –
@TimVermeulen:感谢您的反馈。我这样写它是因为它很容易理解,并且因为我*认为它允许编译器更好地优化代码(没有调用回调的方法)。 –
我_think_编译器将能够优化'map',但你必须看看生成的程序集。我对'步幅'不太自信,但如果事实证明这是个问题,你总是可以用'[24,16,8,0]'替换它。 –
可能重复[如何在快速将Int16转换为两个UInt8字节](http://stackoverflow.com/questions/32830866/how-in-swift-to-convert-int16-to-two-uint8-bytes ) – BallpointBen
你尝试过'NSFileTypeForHFSTypeCode'吗?尽管它的名字,它可以将任何4字符代码从'OSType'转换为'String' –
@CodeDifferent:这在iOS上不可用。 –