java - 如何在 Swift 中将 Java 的 byte 改为 long

标签 java swift byte

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

这是我所做的和失败的事情。

在 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 说

"The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions."

谁能告诉我正确的表达方式吗?

谢谢。

最佳答案

假设 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 所能容纳的字节数。

关于java - 如何在 Swift 中将 Java 的 byte 改为 long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57491500/

相关文章:

java - 类型 IQuery 不接受参数 org.eclipse.equinox.p2.query 和 org.eclipse.equinox.p2.metadata 中的错误

java - Genson 破坏了应用程序 (API)

java - Swing:JTabbedPane 组件子类的自定义 LaF

string - 二进制字符串转unicode

c++ - 我将如何将 AOB 从 Cheat Engine 修改为 C++?

java - 使用 Comparator 对列表进行排序时出现 java.lang.illegalArgumentException : comparison method violates its general contract !

ios - 如何在swift 4中获取从特定字符到字符串末尾的子字符串?

ios - 快速获取比特率 os 音频项

ios - Pushkit VoiP 推送通知唤醒应用执行时间

c# - 如何将 "Add"两个字节放在一起