我正在将用 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."
谁能告诉我正确的表达方式吗?
谢谢。
最佳答案
假设 Byte
是 UInt8
的类型别名:您必须先将字节转换为 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 位平台上,如果结果是上述代码溢出超过有符号整数的最大值。您可能想使用 UInt
、UInt32
或 Int64
来代替。后者在所有平台上都是 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/