将 uint32 值拆分为 swift 中的 uint8 值
split uint32 value to uint8 values in swift
在 C 中我有
uint32 value = 39434;
uint8 firstByte = (unsigned char)value;
uint8 secondByte = (unsigned char)(value >> 8);
是否有可能在 Swift 中实现相同的目标?
在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
.
的范围
另见
为您提供 array 的可能解决方案
输入值的四个字节。
位模式专用初始化程序 init(truncatingBitPattern:)
的替代方法是手动屏蔽所有字节,但感兴趣的字节除外,并适当地移动该字节;然后使用 "standard" 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 >> [=11=] & 0x000000FF) }
}
}
/* example usage */
val.asByteArray
/* [10, 154, 0, 0],
[255, 255, 255, 255], for the examples above */
然而,这自然不如使用专用初始化程序安全,因为它将屏蔽和正确移位的责任交给了开发人员而不是编译器。如果不小心,从四个字节到一个字节的非截断转换将产生运行时整数溢出。
在 C 中我有
uint32 value = 39434;
uint8 firstByte = (unsigned char)value;
uint8 secondByte = (unsigned char)(value >> 8);
是否有可能在 Swift 中实现相同的目标?
在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
.
另见
位模式专用初始化程序 init(truncatingBitPattern:)
的替代方法是手动屏蔽所有字节,但感兴趣的字节除外,并适当地移动该字节;然后使用 "standard" 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 >> [=11=] & 0x000000FF) }
}
}
/* example usage */
val.asByteArray
/* [10, 154, 0, 0],
[255, 255, 255, 255], for the examples above */
然而,这自然不如使用专用初始化程序安全,因为它将屏蔽和正确移位的责任交给了开发人员而不是编译器。如果不小心,从四个字节到一个字节的非截断转换将产生运行时整数溢出。