kotlin ByteArray的无符号词法比较

ioekq8ef  于 2023-10-23  发布在  Kotlin
关注(0)|答案(1)|浏览(138)

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

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

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

y0u0uwnf

y0u0uwnf1#

您可以将有符号Byte转换为无符号字节值,方法是将其转换为更大的数据类型(如IntLong),然后[按位与] it和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方法比较两个字节数组,但它会创建一个新的List,所以它会比for循环方法慢。

相关问题