代码之家  ›  专栏  ›  技术社区  ›  Emil Adz

在Swift中,Java字节数组的正确等价物是什么?

  •  3
  • Emil Adz  · 技术社区  · 7 年前

    我才刚刚开始快速发展。我在Java中有以下方法:

      public static byte[] addChecksum(byte[]command, boolean isDeviceSendFormat) {
        int checksum = 0;
        int l = command.length;
        for (int i=0; i<l-2; i++) {
    
            if (i==1 && isDeviceSendFormat==true) {
                continue;
            }
    
            int val = command[i];
            if (val < 0) {
                val = 0x100 + val;
            }
            checksum += val;
        }
    
        if (l > 2) {
            if (isDeviceSendFormat == false) {
                command[l - 1] = (byte) (checksum % 0x100);  // LSB
                command[l - 2] = (byte) (checksum / 0x100);  // MSB
            }
            else {
                command[l - 2] = (byte) (checksum % 0x100);  // LSB
                command[l - 1] = (byte) (checksum / 0x100);  // MSB
            }
        }
    
        return command;
    }
    

    我需要翻译成Swift,我遇到了一些问题,以下是我目前得到的信息:

    func addCheckSum(bufferInput:[UInt8], isDeviceSendFormat: Bool) -> [UInt8]{
        var checksum: UInt8 = 0
        var length: Int = 0
        var iIndex: Int
        var bufferOutput: [UInt8]
    
        length = bufferInput.count        
    
        for (index, value) in bufferInput.enumerated() {
            if index < bufferInput.count - 2 {
                if value == 1 && isDeviceSendFormat {
                    continue
                }
    
                var val:UInt8 = bufferInput[index]
                if (val < 0) {
                    val = 0x100 + val //Error line
                }
                checksum = checksum + val
            }
        }
    }
    

    但我得到以下错误: Integer literal '256' overflows when stored into 'UInt8' 在上面代码的注释行上。如何将此方法从Java转换为Swift?

    1 回复  |  直到 7 年前
        1
  •  4
  •   OOPer    7 年前

    这是我从Java代码到Swift的翻译:

    public static func addChecksum(_ command: inout [UInt8], isDeviceSendFormat: Bool) -> [UInt8] {
        var checksum: UInt32 = 0
        let l: Int = command.count
        for i in 0..<l-2 {
    
            if i == 1 && isDeviceSendFormat {
                continue
            }
    
            let val = UInt32(command[i])
            //No need to modify `val` as it takes non-negative value when `command` is `[UInt8]`.
            checksum += val
        }
    
        if l > 2 {
            if !isDeviceSendFormat {
                command[l - 1] = UInt8(checksum % 0x100)  // LSB
                command[l - 2] = UInt8(truncatingIfNeeded: checksum / 0x100)  // Next to LSB
            } else {
                command[l - 2] = UInt8(checksum % 0x100)  // LSB
                command[l - 1] = UInt8(truncatingIfNeeded: checksum / 0x100)  // Next to LSB
            }
        }
    
        return command
    }
    
    //Assuming `command` is not too long as to make integer overflow in `checksum += val`.
    

    一些注意事项:

    • 以下三行Java代码:

      if (val < 0) {
          val = 0x100 + val;
      }
      

      转换值-128。。。127,到0。。。255通过添加 0x100 (= 256 )当 val 为负。所以 val公司 接受0中的任何值。。。255,所以我选择 [UInt8] 对于 command . 当您选择时 UInt8 ,Swift中不需要Java中的上述3行。

    • 在Swift代码中,您已选择 UInt8 对于 checksum val公司 但是 int 在Java中是32位长的,我选择 UInt32 为了他们。假设可能永远不会发生整数溢出,它们只接受非负值,因此非负的32位长整数是合适的。


    没有直接等同于 byte[] 在Swift中的Java。所以,在某些情况下 [UInt8] [Int8] . 您可以找到许多Java 字节[] 被翻译成 Data 斯威夫特的。