gpt4 book ai didi

Java/Kotlin UDP 数据报

转载 作者:行者123 更新时间:2023-12-02 09:14:10 30 4
gpt4 key购买 nike

我有一个非常基本的问题。想象一下,有一个简单的 udp 客户端,它正在监听传入的数据报。这些数据报只是字节[],但它们可能包含复杂的信息,如字符串、整数等。

是否有任何优雅的方法来解码数据报,例如使用定义数据报内容的结构和 C 中的联合,而不是逐步处理接收到的 byte[] ,例如字节缓冲区?

编辑 1

好的,现在尝试 FlatBuffers。我可以构建一个测试项目来玩一下。我想要执行的第一个测试是解析最简单的可能的事情。只有一个短 (int16)。我正在使用这个 .fbs 方案

// Example IDL file for our monster's schema.

namespace UDPdatagram;


table DatContent {
id:short;
}


root_type DatContent;

我尝试运行的最少代码如下:

package controllingFXML

import UDPdatagram.DatContent
import java.nio.ByteBuffer

fun main() {
// use a short (16 byte int, i.e. 2 byte)
val byteArray = ByteArray(2)
// the test number
val testShort: Short = 67
println("TEST SHORT: $testShort")

// allocate a byte buffer and add the test short
val buffer = ByteBuffer.allocate(byteArray.size)
buffer.position(0)
buffer.putShort(testShort)

// reset the position and verify its content
buffer.position(0)
val buffShort = buffer.short
println("BUFFER SHORT: $buffShort")

// reset the position of the buffer again and try to use flatbuffers
buffer.position(0)
val content = DatContent.getRootAsDatContent(buffer)
println("PARSED CONTENT: ${content.id()}")
}

不幸的是,在运行代码时我总是得到以下信息:

Exception in thread "main" java.lang.IndexOutOfBoundsException
at java.base/java.nio.Buffer.checkIndex(Buffer.java:688)
at java.base/java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:392)
at UDPdatagram.DatContent.getRootAsDatContent(DatContent.java:14)
at UDPdatagram.DatContent.getRootAsDatContent(DatContent.java:13)
at controllingFXML.AsdfKt.main(asdf.kt:25)
at controllingFXML.AsdfKt.main(asdf.kt)

我完全迷路了。我在这里缺少什么?

最佳答案

Java 中没有像 C 那样的一对一解决方案。此外,即使在 C 语言中,它也不是最好的解决方案,因为数据解释取决于系统的字节序。

但是 FlatBuffers 库可能有用。

关于Java/Kotlin UDP 数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59137072/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com