最近我试图从一个包含几个基本类型变量的类对象中创建一个字节数组。问题开始于将double格式保存为8字节格式。取回后,检索值不一样,但有点接近。
首先我检查了这个表达式val value = Double.fromBits(1.2.toBits())
,它给了我一个正确的答案。所以,我猜我的实现有问题,移动长整数到字节数组,但我找不到错误。
示例如下,我将非常感谢任何建议。干杯!
写入字节数组:
fun from(value : Long) : ByteArray{
val byteArray = ByteArray(Long.SIZE_BYTES)
var index = 0
var shift = 8 * Long.SIZE_BYTES
while(index < Long.SIZE_BYTES){
shift -= 8
byteArray[index] = value.shr(shift).and(0xFFL).toByte()
index++
}
return byteArray
}
从字节数组中读取:
fun read(byteArray: ByteArray) : Long{
var value = 0L
var index = 0
while(index < Long.SIZE_BYTES){
value = value.shl(8) + byteArray[index].toLong()
index++
}
return value
}
您的read()
不能正确工作为负字节。你需要记住,正数是"填充"的。对于0,负数用1填充。右移或扩大一个整数会根据符号增加0
或1
。
错误在这一行:
value = value.shl(8) + byteArray[index].toLong()
您期望字节FF
转换为long后会变成0x00000000000000FF
,但实际上它是0xFFFFFFFFFFFFFFFF
。您需要与0xFF
进行AND操作,以获取最低的字节:
value = value.shl(8) + byteArray[index].toLong().and(0xFF)