如何在swift转换Int16到两个UInt8字节



我有一些二进制数据,它们将两个字节的值编码为有符号整数。

bytes[1] = 255  // 0xFF
bytes[2] = 251  // 0xF1

这是相当容易的-我可以从这些字节中提取Int16值:

Int16(bytes[1]) << 8 | Int16(bytes[2])

编码

这是我遇到的问题。我的大多数数据规范都要求UInt,这很容易,但我在提取构成Int16的两个字节时遇到了麻烦

let nv : Int16 = -15
UInt8(nv >> 8) // fail
UInt8(nv)      // fail

如何提取构成Int16值的两个字节

您应该使用无符号整数:

let bytes: [UInt8] = [255, 251]
let uInt16Value = UInt16(bytes[0]) << 8 | UInt16(bytes[1])
let uInt8Value0 = uInt16Value >> 8
let uInt8Value1 = UInt8(uInt16Value & 0x00ff)

如果你想将UInt16转换为位等效的Int16,那么你可以使用特定的初始化式:

let int16Value: Int16 = -15
let uInt16Value = UInt16(bitPattern: int16Value)

,反之亦然:

let uInt16Value: UInt16 = 65000
let int16Value = Int16(bitPattern: uInt16Value)

在你的例子中:

let nv: Int16 = -15
let uNv = UInt16(bitPattern: nv)
UInt8(uNv >> 8)
UInt8(uNv & 0x00ff)

您可以使用init(truncatingBitPattern: Int16)初始化器:

let nv: Int16 = -15
UInt8(truncatingBitPattern: nv >> 8) // -> 255
UInt8(truncatingBitPattern: nv) // -> 241

我要这样做:

let a = UInt8(nv >> 8 & 0x00ff)  // 255
let b = UInt8(nv & 0x00ff)       // 241
extension Int16 {
    var twoBytes : [UInt8] {
        let unsignedSelf = UInt16(bitPattern: self)
        return [UInt8(truncatingIfNeeded: unsignedSelf >> 8),
                UInt8(truncatingIfNeeded: unsignedSelf)]
    }
}
var test : Int16 = -15
test.twoBytes // [255, 241]

最新更新