【问题标题】:Comparing ByteArray in Kotlin比较 Kotlin 中的 ByteArray
【发布时间】:2018-02-26 12:20:16
【问题描述】:

我有两个字节数组,我想比较它们。我有一个这样的循环(为了清楚起见,它更像是一个 Javaish 循环):

for (i in 0..63) {
    if (newArray[i] != oldArray[i]) {
        return newArray[i] < oldArray[i]
    }
}

例如,newArray[0]0x93oldArray[0]0x00。这仍然返回 true(意味着 newArray 小于 oldArray),因为它是作为有符号比较完成的。有没有办法比较绝对(无符号)值?还是比较字节数组的集合?

【问题讨论】:

    标签: arrays kotlin


    【解决方案1】:

    您可以通过将带符号的Byte 转换为更大的数据类型(如IntLong)然后将其与0xFF [按位与] 转换为无符号字节值。

    for (i in 0..63) {
        if (newArray[i] != oldArray[i]) {
            return (newArray[i].toInt() and 0xFF) < (oldArray[i].toInt() and 0xFF)
        }
    }
    

    如果你经常使用它,你可以做一个扩展功能。

    fun Byte.toUnsignedValue(): Int = this.toInt() & 0xFF
    
    for (i in 0..63) {
        if (newArray[i] != oldArray[i]) {
            return newArray[i].toUnsignedValue() < oldArray[i].toUnsignedValue()
        }
    }
    

    不幸的是,在低版本 Kotlin(或未启用实验功能)中 ByteShort 中没有按位和运算:bitwise & doesn't work with bytes in kotlin

    而且,JVM 没有无符号数据类型,除了char,它是 2 字节无符号数据。

    Why doesn't Java support unsigned ints?

    就像Java中没有运算符重载一样。 Kotlin 添加了运算符重载,但添加无符号数据类型是更根本的问题,因为 JVM 本身没有它们。


    你可以使用zip方法比较两个字节数组而不使用for循环,但它会创建一个新的List,所以它会比for循环方法慢。

    【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2018-12-26
    • 2018-12-18
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多