【问题标题】:Java to Swift code conversion Fatal Error: Not enough bits to represent the passed valueJava 到 Swift 代码转换致命错误:没有足够的位来表示传递的值
【发布时间】:2021-09-14 19:31:28
【问题描述】:

我正在尝试基于现有的 Android 应用程序构建 iOS 应用程序,并且必须将涉及位移的函数从 Java 转换为 Swift。这是Java中的原始函数:

public static void BUF_U32_BE(byte[] d, int loc, int val) {
    d[loc] = (byte)(val >> 24);
    d[loc+1] = (byte)(val >> 16);
    d[loc+2] = (byte)(val >> 8);
    d[loc+3] = (byte)(val & 0xFF);
}

这是我将函数转换为 Swift 的尝试:

func BUF_U32_BE(byteArray: [UInt8], loc:  Int, val: Int)  -> [UInt8]{
    var d = byteArray;
    d[loc] = UInt8((val >> 24));
    d[loc+1] = UInt8((val >> 16));
    d[loc+2] = UInt8((val >> 8));
    d[loc+3] = UInt8((val & 0xFF));
    return d;
}

运行 Swift 版本时,出现错误:

致命错误:没有足够的位来表示传递的值

这是产生错误的行:

d[loc+1] = UInt8((val >> 16));

什么可能导致这个问题,我应该怎么做才能解决它?

【问题讨论】:

  • 我不知道 swift 但是这 UInt8((val >> 16) & 0xFF); 有效吗?

标签: java android ios swift bit-manipulation


【解决方案1】:

您正在寻找UInt8.init(truncatingIfNeeded:)


顺便说一句,这个byteArray: [UInt8] 参数非常不稳定。它被传入、复制、变异和返回。它从来没有读过。这很奇怪。我认为您希望这会直接进入 byteArray 索引处的 byteArray,但由于您正在制作副本,因此实际上不会发生这种情况。

在 Swift 中,我们会简单地为固定数量的值返回一个元组,如下所示:

// FIXME: `BUF_U32_BE` is a bad name. Perhaps `splitIntoBytes(_:)`?
func BUF_U32_BE(val: Int) -> (UInt8, UInt8, UInt8, UInt8) {
    return (
        UInt8(truncatingIfNeeded: val >> 24),
        UInt8(truncatingIfNeeded: val >> 16),
        UInt8(truncatingIfNeeded: val >>  8),
        UInt8(truncatingIfNeeded: val >>  0),
    )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多