如何从 Swift 中的 Big-endian 表示中计算 Int 值?

Posted

技术标签:

【中文标题】如何从 Swift 中的 Big-endian 表示中计算 Int 值?【英文标题】:How to calculate Int value from Big-endian representation in Swift? 【发布时间】:2021-10-08 18:58:39 【问题描述】:

我正在通过 BLE 传输 UInt16 值。根据我的阅读,为此,我需要将UInt16 转换为UInt8,这将转换为Data 类型。我一直在指this thread。例如,我使用了下面的代码:

extension Numeric 
    var data: Data 
        var source = self
        return Data(bytes: &source, count: MemoryLayout<Self>.size)
    

extension Data 
    var array: [UInt8]  return Array(self) 


let arr = [16, 32, 80, 160, 288, 400, 800, 1600, 3200]

for x in arr 
    let lenghtByte = UInt16(x)
    let bytePtr = lenghtByte.bigEndian.data.array
    print(lenghtByte, ":", bytePtr)

我不太明白的是,当我将UInt16 转换为大端数组时,这些值将如何加起来为相应的实际值。希望这是有道理的。上面sn-p的输出是,

16 : [0, 16]
32 : [0, 32]
80 : [0, 80]
160 : [0, 160]
288 : [1, 32]
400 : [1, 144]
800 : [3, 32]
1600 : [6, 64]
3200 : [12, 128]

我想知道的是如何使用 Big-endian 数组中的 UInt8 值计算 160 之后的每个值? (即 [12,128] 如何等同于 3200,同样)。

提前谢谢你:)

【问题讨论】:

12 * 256 + 128 = 3200 也许这个***.com/questions/68258711/… 和***.com/questions/68258711/… 也有帮助 【参考方案1】:

data 属性的作用是查看数字的二进制表示,将其分成字节,然后将其放入Data 缓冲区。例如,对于大端的 1600,二进制表示如下:

0000011001000000

注意整数中有两个字节 - 00000110(十进制的“6”)和01000000(十进制的“64”)。这就是[6, 64] 的来源。

要从[6, 64] 取回 1600,您只需要注意“6”实际上并不代表 6,就像 52 中的“5”不代表 5,而是 5 * 10。这里,“6”代表6 * 256,或6 &lt;&lt; 8(6 向左移动了 8 次)。总的来说,要找回数字,您应该这样做

a << 8 + b

其中a 是第一个数组元素,b 是第二个。

一般来说,对于一个 n 字节的数,你可以这样计算:

// this code is just to show you how the array and the number relates mathematically
// if you want to convert the array to the number in code, see
// https://***.com/a/38024025/5133585
var total = 0
for (i, elem) in byteArray.enumerated() 
    total += Int(elem) << (8 * (byteArray.count - i - 1))

【讨论】:

以上是关于如何从 Swift 中的 Big-endian 表示中计算 Int 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 中的 url 从 firebase 正确检索数据?

IOS/Swift:将表视图中的对象传递给详细视图控制器

如何在swift中的动态表视图中创建动态表视图?

如何在 swift 4 中的另一个表视图控制器中获取该表视图单元格中的文本字段文本?

如何在swift 3中的表视图单元格中实现集合视图的分页?

小端格式和大端格式(Little-Endian&Big-Endian)