如何在Swift中将Java的字节更改为long

时间:2019-08-14 09:05:02

标签: java swift byte

我正在将用Java编写的Android应用程序移植到Swift中的iOS。 我必须将字节数据存储到long变量中。

这就是我所做的和失败的。

在Java中,

public class TEST {
    public long mode_time;

    public void setData(byte[] raw) {
        mode_time = (long)((raw[3] << 24 |  (raw[2] << 16) | (raw[1] << 8) | (raw[0] << 0));
    }
}

我在Swift中的尝试

class TEST {
    var mode_time : Int = 0

    func setData(raw : [UInt8]) {
        mode_time = Int(raw[3] << 24 |  raw[2] << 16 | raw[1] << 8 | raw[0] << 0)
    }
}

Xcode说

  

“编译器无法合理地对该表达式进行类型检查    时间;尝试将表达式分成不同的子表达式。”

有人能让我知道正确的表达吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

假设ByteUInt8的类型别名:您必须先将字节转换为Int,然后再将值向左移动,否则将结果可能溢出。这也有助于编译器成功地编译表达式:

func setData(raw : [Byte]) {
    mode_time = Int(raw[3] << 24) | Int(raw[2] << 16) | Int(raw[1] << 8) | Int(raw[0] << 0)
}

还请注意,Swift Int类型取决于平台,它可以是32位或64位整数,并且在32位平台上,如果结果超出最大值,则上述代码将溢出有符号整数的值。您可能想改用UIntUInt32Int64。后者在所有平台上都是64位整数,例如Java的long

另一种实现方式是

func setData(raw : [Byte]) {
    mode_time = raw.reversed().reduce(Int(0)) { ($0 << 8) + Int($1) }
}

如果您提供的字节数不超过Int的字节数。