簡體   English   中英

如何快速將Int16轉換為兩個UInt8字節

[英]How in swift to convert Int16 to two UInt8 Bytes

我有一些二進制數據,將兩個字節的值編碼為有符號整數。

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM