如何在 swift 中将 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)
我会这样做:
let a = UInt8(nv >> 8 & 0x00ff) // 255
let b = UInt8(nv & 0x00ff) // 241
您可以使用 init(truncatingBitPattern: Int16)
初始值设定项:
let nv: Int16 = -15
UInt8(truncatingBitPattern: nv >> 8) // -> 255
UInt8(truncatingBitPattern: nv) // -> 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]
我有一些二进制数据将两个字节的值编码为有符号整数。
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)
我会这样做:
let a = UInt8(nv >> 8 & 0x00ff) // 255
let b = UInt8(nv & 0x00ff) // 241
您可以使用 init(truncatingBitPattern: Int16)
初始值设定项:
let nv: Int16 = -15
UInt8(truncatingBitPattern: nv >> 8) // -> 255
UInt8(truncatingBitPattern: nv) // -> 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]