我有两个字节数组,我想比较它们。我有一个这样的循环(为了清楚起见,它更像是一个 Javaish 循环):
for (i in 0..63) {
if (newArray[i] != oldArray[i]) {
return newArray[i] < oldArray[i]
}
}
例如,newArray[0]
为0x93
,oldArray[0]
为0x00
。这仍然返回 true (意味着newArray小于oldArray),因为它是作为签名比较完成的。有没有办法比较绝对(无符号)值?还是一个比较字节数组的集合?
答案 0 :(得分:2)
您可以将已签名的Byte
转换为无符号字节值,方法是将其转换为更大的数据类型(如Int
,Long
),然后再按[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中Byte
和Short
没有按位和操作(或者没有启用实验功能):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循环方法慢。