需要将字节数组/二进制消息从 UDP DatagramPacket 转换为 java 中的几个字段

Posted

技术标签:

【中文标题】需要将字节数组/二进制消息从 UDP DatagramPacket 转换为 java 中的几个字段【英文标题】:Need to convert byte array/ binary message from UDP DatagramPacket to several fields in java 【发布时间】:2012-10-19 23:38:48 【问题描述】:

我有一个包含 10 字节消息的字节数组。我知道前 2 个字节包含一个想要提取到字符串的 id。此 id 的一个示例是:2001。其余字节由我知道的其他字段组成。

我正在从 UDP 消息接收二进制数据,在尝试使用以下方法转换二进制/字节数组后,我的打印仍然记录二进制消息。

我使用的代码如下转换二进制UDP消息:

 DatagramPacket rcvMsg = receivepacket.getData();
 String id = new String(rcvMsg, 0, 2, "US-ASCII");
 System.out.println("id ----- : "+id);

如何让这个从二进制数据报消息中打印 2001?

【问题讨论】:

【参考方案1】:

您希望以什么格式恢复前 2 个字节?它们是表示整数,还是编码字符串?

因为,否则您可以将数组包装到 ByteArrayInputStream 中,然后将后者包装到 DataInputStream 中,然后使用 DataInputStream 方法在您认为合适的时候读取您的消息。

DataInput input = new DataInputStream(new ByteArrayInputStream(myArray));
String id = String.valueOf(input.readShort())

如果它们对应于支持的 Java 数据类型(即 byte、short、int、String 等),您甚至可以继续使用此对象来读取数组中编码的其余字段。

现在,如果您的前两个字节仅表示 ASCII 字符(或任何其他编码),那么您最好使用 String 构造函数之一:

String id = new String(myBytes, 0, 2, "US-ASCII");

【讨论】:

【参考方案2】:

将您的字节数组转换为字符串,然后根据需要使用子字符串对其进行切割。

如果有帮助,这里有一个与 c# 中的代码类似的问题(与 java 不太相似): How to create a packet in C#

此处基于 java 示例更新:Java Byte Array to String to Byte Array

byte[] bytes = new byte[] 97, 98, 99;
String str = new String(bytes);
System.out.println(str.substring(0,2));
System.out.println(str.substring(2));

【讨论】:

与其他高度赞成的问题相比,这实际上有效。

以上是关于需要将字节数组/二进制消息从 UDP DatagramPacket 转换为 java 中的几个字段的主要内容,如果未能解决你的问题,请参考以下文章

构造UDP数据包的字节数组

为啥 Netty 从 UDP 消息中只给我 768 个字节

将字节数组从java程序发送到c++

java socket 处理字节问题 16进制发过去 UDP 协议

将字符串与字符串进行比较(DatagramPacket 中的字节数组)

将十六进制数组(char *)转换为整数