需要将字节数组/二进制消息从 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 中的几个字段的主要内容,如果未能解决你的问题,请参考以下文章
java socket 处理字节问题 16进制发过去 UDP 协议