Kotlin 1.5 16位整数转长度为2的Byte及OutputStream输出问题
Kotlin 1.5 16位整数转字节数组及OutputStream写入方案
问题1:16位整数转换为长度为2的大端字节数组
Kotlin 可以通过两种常用方式实现和 Python i.to_bytes(2, byteorder='big') 完全等价的转换效果:
- 方案1:使用JDK内置
ByteBuffer实现(代码可读性高,默认就是大端序)
import java.nio.ByteBuffer var i = ((2.0.pow(16) - 1) * ratio).toInt() // 分配2字节空间,写入16位Short值后直接转为ByteArray val output: ByteArray = ByteBuffer.allocate(2).putShort(i.toShort()).array()
- 方案2:手动位运算实现(性能更高,无需额外导入依赖)
var i = ((2.0.pow(16) - 1) * ratio).toInt() // 高8位在前,低8位在后,符合大端序要求 val output: ByteArray = byteArrayOf( (i shr 8).toByte(), i.toByte() )
两种方案得到的output都是长度为2的字节数组,和Python示例的输出完全一致。
问题2:OutputStream写入实现
OutputStream的write()方法本身就支持直接传入ByteArray参数,不需要先转成字符串再调用toByteArray(),你可以直接用上面得到的output字节数组写入:
import java.net.Socket import java.io.OutputStream // 省略前面生成output的逻辑 val socket: Socket = Socket("目标服务地址", 目标端口) val outputStream: OutputStream = socket.getOutputStream() // 直接写入字节数组即可,无需转字符串 outputStream.write(output) // 可选:缓冲区数据强制刷出,避免数据滞留在内存 outputStream.flush()
如果你的业务场景确实需要先转成字符串再传输,可以指定字符集避免乱码:
// 仅当需要传输字符串格式的数值时使用 val strValue = i.toString() outputStream.write(strValue.toByteArray(Charsets.UTF_8))
内容的提问来源于stack exchange,提问作者Stigma
相关产品推荐
相关产品推荐

