值C I有分裂UINT32值UINT8在迅速
uint32 value = 39434;
uint8 firstByte = (unsigned char)value;
uint8 secondByte = (unsigned char)(value >> 8);
是否有可能實現斯威夫特一樣嗎?
值C I有分裂UINT32值UINT8在迅速
uint32 value = 39434;
uint8 firstByte = (unsigned char)value;
uint8 secondByte = (unsigned char)(value >> 8);
是否有可能實現斯威夫特一樣嗎?
這是很相似的斯威夫特:
let value : UInt32 = 39434
let firstByte = UInt8(truncatingBitPattern: value) // 10
let secondByte = UInt8(truncatingBitPattern: value >> 8) // 154
特殊的初始化init(truncatingBitPattern:)
這裏需要因爲斯威夫特(相對於C),不會隱 截斷整數:
let firstByte = UInt8(value)
會如果value
不符合 的範圍UInt8
,將導致運行時異常。
也Split UInt32 into [UInt8] in swift 參見可能的解決方案,其給你陣列與 四個字節的輸入值的。
位模式專用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 */
這是一個計算的屬性,然而,自然不會因爲使用專用的初始化,因爲它掩蓋的地方,正確的換擋對開發商,而不是編譯器的責任是安全的。如果不小心,從四個字節到一個字節的非截斷轉換將產生運行時整數溢出。