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)
| 归档时间: |
|
| 查看次数: |
6246 次 |
| 最近记录: |