How in swift to convert Int16 to two UInt8 Bytes

前提是你 提交于 2019-12-20 10:39:08

问题


I have some binary data that encodes a two byte value as a signed integer.

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

Decoding

This is fairly easy - I can extract an Int16 value from these bytes with:

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

Encoding

This is where I'm running into issues. Most of my data spec called for UInt and that is easy but I'm having trouble extracting the two bytes that make up an Int16

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

Question

How would I extract the two bytes that make up an Int16 value


回答1:


You should work with unsigned integers:

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

If you want to convert UInt16 to bit equivalent Int16 then you can do it with specific initializer:

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

And vice versa:

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

In your case:

let nv: Int16 = -15
let uNv = UInt16(bitPattern: nv)

UInt8(uNv >> 8)
UInt8(uNv & 0x00ff)



回答2:


You could use init(truncatingBitPattern: Int16) initializer:

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



回答3:


I would just do this:

let a = UInt8(nv >> 8 & 0x00ff)  // 255
let b = UInt8(nv & 0x00ff)       // 241



回答4:


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]


来源:https://stackoverflow.com/questions/32830866/how-in-swift-to-convert-int16-to-two-uint8-bytes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!