在Kotlin中比较ByteArray

时间:2018-02-26 02:05:52

标签: arrays kotlin

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以将已签名的Byte转换为无符号字节值,方法是将其转换为更大的数据类型(如IntLong),然后再按[bitwise]将其转换为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循环方法慢。