在UI中将UInt32拆分为[UInt8]

Kel*_*elo 7 bitwise-operators swift

我想添加UInt32到我使用的字节缓冲区[UInt8].在java中,有一个方便的ByteBuffer类,它具有像putInt()这样的方法,就像这样.怎么可以在swift中完成?

我想我可以解决这个问题如下:

let example: UInt32 = 72 << 24 | 66 << 16 | 1 << 8 | 15
var byteArray = [UInt8](count: 4, repeatedValue: 0)

for i in 0...3 {
    byteArray[i] = UInt8(0x0000FF & example >> UInt32((3 - i) * 8))
}
Run Code Online (Sandbox Code Playgroud)

这是非常冗长的,任何更简单的方法?

Mar*_*n R 14

你的循环可以更紧凑地写成

let byteArray = 24.stride(through: 0, by: -8).map {
    UInt8(truncatingBitPattern: example >> UInt32($0))
}
Run Code Online (Sandbox Code Playgroud)

或者,创建一个UnsafeBufferPointer并将其转换为数组:

let example: UInt32 = 72 << 24 | 66 << 16 | 1 << 8 | 15

var bigEndian = example.bigEndian
let bytePtr = withUnsafePointer(&bigEndian) {
    UnsafeBufferPointer<UInt8>(start: UnsafePointer($0), count: sizeofValue(bigEndian))
}
let byteArray = Array(bytePtr)

print(byteArray) // [72, 66, 1, 15]
Run Code Online (Sandbox Code Playgroud)

更新Swift 3(Xcode 8 beta 6):

var bigEndian = example.bigEndian
let count = MemoryLayout<UInt32>.size
let bytePtr = withUnsafePointer(to: &bigEndian) {
    $0.withMemoryRebound(to: UInt8.self, capacity: count) {
        UnsafeBufferPointer(start: $0, count: count)
    }
}
let byteArray = Array(bytePtr)
Run Code Online (Sandbox Code Playgroud)


小智 6

我有类似的需求,并试图了解一些有关手动内存管理的知识。我是否遗漏了什么,或者使用新版本的 Swift 是否变得更容易?(我使用的是 Swift 5)

[UInt8]从 a创建字节数组 ( )UInt32

let example: UInt32 = 1

let byteArray = withUnsafeBytes(of: example.bigEndian) {
    Array($0)
}

print(byteArray) // [0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)

或者,如果您想附加到现有数组,可以在闭包中完成:

var existingArray: [UInt8] = [1, 2, 3]
let example: UInt32 = 1

withUnsafeBytes(of: example.bigEndian) {
    existingArray.append(contentsOf: $0)
}

print(existingArray)  // [1, 2, 3, 0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)