2017-03-03 37 views
2

我想一个Int32转换成由四个C风格的字符串,1字节宽字符(可能是密切相关的this斯威夫特3)。斯威夫特3 - 如何为Int32记忆转化为四个字符

这样做的用途是Core Audio的许多API函数返回一个OSStatus(实际上是一个Int32),它通常可以解释为由四个C样式字符组成的字符串。

fun interpretAsString(possibleMsg: Int32) -> String { 
    // Blackbox 
} 
+0

可能重复[如何在快速将Int16转换为两个UInt8字节](http://stackoverflow.com/questions/32830866/how-in-swift-to-convert-int16-to-two-uint8-bytes ) – BallpointBen

+0

你尝试过'NSFileTypeForHFSTypeCode'吗?尽管它的名字,它可以将任何4字符代码从'OSType'转换为'String' –

+0

@CodeDifferent:这在iOS上不可用。 –

回答

1

我没有测试此代码,但试试这个:

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 
} 
2

其实 “四个字符代码” 通常是一个无符号位 值:

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) } 

除非功能是应用程序的性能关键, 拾取你最熟悉的东西(否则测量和比较)。

+0

我通常使用'UInt16(UInt8.max)'而不是有点神奇的'0xFF',但我想这是一个经验问题。我也建议使用'map'来创建'chars'数组,它会为您节省一些时间在您最后的编辑:) –

+0

@TimVermeulen:感谢您的反馈。我这样写它是因为它很容易理解,并且因为我*认为它允许编译器更好地优化代码(没有调用回调的方法)。 –

+0

我_think_编译器将能够优化'map',但你必须看看生成的程序集。我对'步幅'不太自信,但如果事实证明这是个问题,你总是可以用'[24,16,8,0]'替换它。 –