You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 02:03:00