因为自己写的kwsify是通过过纯文本json发送数据帧的如果想发送二进制数据的话就没办法了于是我就了解了一下kotlin中操作二进制数据的方法下面就是具体思路
- 首先需要编码/解码二进制需要一个数据载体这个载体就是
ByteBuffer(当然也可以是DataOutputStream)这里为了更清楚的操作二进制我就使用ByteBuffer来操作 - 还需要一个数据类来存放解码后/编码前的人类可读数据
data class OPCodePacket(
val op: Int,
val body: String
) {
fun toByteArray(): ByteArray {
val bodySize = body.toByteArray().size
val body = body.toByteArray()
val totalLength = 4 + 4 + bodySize
val buffer = ByteBuffer.allocate(totalLength).apply {
putInt(op)
putInt(bodySize)
put(body)
}
return buffer.array()
}
companion object {
fun fromByteArray(buffer: ByteBuffer): OPCodePacket {
buffer.flip()
val op = buffer.int
val bodySize = buffer.int
val body = ByteArray(bodySize).apply {
buffer.get(this)
}
return OPCodePacket(op, String(body))
}
}
}
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:xiaoman1221@yhdzz.cn,工作室将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有。



蹲个后续,看看怎么加CRC校验这块儿
那如果body里还有嵌套结构咋办,还得递归解析?
楼主用ByteBuffer是想跨平台吧?M1应该没问题。
蛮好的方案,就是不知道高并发下稳不稳。
这代码看着顺滑,不过边界检查是不是少了点?
DataOutputStream虽然简单,但控制力没这么细吧。
前几天自己也搞了个类似的包解析,真的头大。
写得挺清楚的,比那些云里雾里的强多了。
那如果是变长字段的情况咋处理?
蛮好的,比网上那些抄来抄去的强
同感,网上一堆复制粘贴的根本跑不起来。
蹲个后续,看看怎么处理粘包拆包的
bodySize先读再分配数组,不怕恶意数据搞崩吗?
又是纯手搓协议解析,作者肝帝实锤了 👍
求问下这个OPCodePacket能直接用在Ktor里不?
求问这个配置在Ktor里能直接用吗?
hhh 二进制操作写成这样也算清晰了
粘包问题来了,坐等作者出下一集hhh
感觉还行,但DataOutputStream不是更简单点?
前几天刚搞完类似的东西,确实折腾了好久
这ByteBuffer用得挺溜啊,不过M1上跑会有兼容问题吗?