将uint32值拆分为swift中的uint8值

时间:2016-03-20 20:06:56

标签: swift type-conversion uint8t

在C中我有

uint32 value = 39434;
uint8 firstByte = (unsigned char)value;
uint8 secondByte = (unsigned char)(value >> 8);

是否有可能在Swift中实现相同的目标?

2 个答案:

答案 0 :(得分:5)

在Swift中非常相似:

let value : UInt32 = 39434
let firstByte = UInt8(truncatingBitPattern: value) // 10
let secondByte = UInt8(truncatingBitPattern: value >> 8) // 154

特殊初始值设定项init(truncatingBitPattern:) 这里需要因为Swift(与C相反),并不含蓄 截断整数:

let firstByte = UInt8(value)
如果value不适合,

将导致运行时异常 范围UInt8

另见Split UInt32 into [UInt8] in swift 可能的解决方案,为您提供数组 输入值的四个字节。

答案 1 :(得分:1)

bitpattern专用initalizer init(truncatingBitPattern:)的替代方法是手动屏蔽所有字节但感兴趣的字节,并适当地移位该字节;然后使用“标准”UInt8值转换初始值设定项:

let val : UInt32 = 39434

let byte1 = UInt8(val & 0x000000FF)         // 10
let byte2 = UInt8((val & 0x0000FF00) >> 8)  // 154
let byte3 = UInt8((val & 0x00FF0000) >> 16) // 0
let byte4 = UInt8((val & 0xFF000000) >> 24) // 0

/* ... */
let val : UInt32 = UINT32_MAX

let byte1 = UInt8(val & 0x000000FF)         // 255
let byte2 = UInt8((val & 0x0000FF00) >> 8)  // 255
let byte3 = UInt8((val & 0x00FF0000) >> 16) // 255
let byte4 = UInt8((val & 0xFF000000) >> 24) // 255

或者,为了简化,例如作为扩展

中的计算属性
extension UInt32 {
    var asByteArray: [UInt8] {
        return [0, 8, 16, 24]
            .map { UInt8(self >> $0 & 0x000000FF) }
    }
}

/* example usage */
val.asByteArray 
    /* [10, 154, 0, 0], 
       [255, 255, 255, 255], for the examples above */
然而,这自然不如使用专用初始化程序那么安全,因为它将掩盖和正确移位的责任放在开发人员而不是编译器上。如果不注意,从四个字节到一个字节的非截断转换将产生运行时整数溢出。