问题描述
将 16 位整数转换为长度为 2 的字节的 Kotlin 1.5 命令是什么?次要问题是 outputstream 最后需要一个字符串,以便它可以使用 toByteArray() 进行转换
# Original Python Code
...
i = int((2**16-1)*ratio) # 16 bit int
i.to_bytes(2,byteorder='big')
output = (i).to_bytes(2,byteorder='big')
# Kotlin Code so far
var i = ((2.0.pow(16) - 1) * ratio).toInt() // Convert to 16 bit Integer
print("16 bit Int: " + i)
output = .....
....
...
val outputStream: OutputStream = socket.getoutputStream()
outputStream.write(output.toByteArray()) // write requires ByteArray for some reason
解决方法
这是简单的数学,因此最好手动计算并定义为扩展函数:
fun Int.to2ByteArray() : ByteArray = byteArrayOf(toByte(),shr(8).toByte())
然后就可以使用了:
output = i.to2ByteArray()
outputStream.write(output)
注意,此函数以小端序写入整数。如果您需要 big-endian,只需颠倒数组中项目的顺序。如果需要,您还可以添加一些最小/最大检查。
此外,如果您只需要 16 位值,那么您可以考虑使用 Short
或 UShort
而不是 Int
。它在内存使用方面没有太大变化,但它可能是一种更简洁的方法 - 我们可以将我们的扩展命名为 toByArray()
并且我们不需要最小/最大检查。