我正在尝试使用Java从localhost上的UDP端口读取数据。我对Java非常好,但我现在已经解决了这个问题......
问题是,在使用DatagramSocket连接并收到DatagramPacket的数据包后,我得到了一些没有意义的字节,我看不到与我期望的数据的连接。打印输出如下:
$őZAŇ"¤E€^ĽxΕ’M@ŢúCîS5;Ń8†8Ŕ$5»ôxŕ¸Ţf+?’Ť;Ů%>ż?>żA€ĹĽ‘_
所以,我显然是以错误的方式处理某事。我还阅读了Java的一些签名/未签名数据问题。
大约一年前,我用C#创建了一个类似的应用程序,一切都很顺利。
真的希望有人可以提供帮助。
这是代码(其中一个版本,我尝试了很多不同的解决方案)
DatagramSocket mySocket = new DatagramSocket(null);
InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 20777);
mySocket.bind(addr);
byte[] receiveData = new byte[152];
while(true)
{
DatagramPacket receivePacket = new DatagramPacket(receiveData, 0, receiveData.length);
mySocket.receive(receivePacket);
byte[] barray = receivePacket.getData();
ByteArrayInputStream inputStream = new ByteArrayInputStream(barray);
DataInputStream dInputStream = new DataInputStream(inputStream);
float a = dInputStream.readFloat();
System.out.println(a);
}
答案 0 :(得分:1)
使用此方法可以将字节数组转换为十六进制字符串表示形式。
private String bytesToHex(byte[] bytes) {
char[] hexArray = "0123456789ABCDEF".toCharArray();
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
希望它有所帮助。
答案 1 :(得分:0)
我不会将您的问题标记为副本,因为它是您的第一个,但我认为您应该参考this other exchange。可以为您的问题提供非常优雅和清晰的解决方案。
顺便说一句,引用您阅读的部分的代码是受欢迎的。祝你好运......
答案 2 :(得分:0)
你需要:
DataInputStream
的字节数组的ByteArrayInputStream
缠绕的DatagramPacket,
不要忘记使用带有偏移和长度的构造函数,这是从DatagramPacket.
DataInputStream
方法的代码。目前你似乎没有(1)。没有它,你就没有希望。只是想要有意义的&#39;二进制数据,特别是打印它,完全浪费你的时间。
编辑如果根据您的评论,所有字段都是floats
,只需循环调用DataInputStream.readFloat()
的数据报,直到它抛出EOFException
:
try
{
while (true)
{
float f = dataInputStream.readFloat();
System.out.println(f);
}
}
catch (EOFException exc)
{
// expected
}
如果这不起作用(即产生可识别的值),则必须切换到DatagramSocketChannel
和ByteBuffer
并尝试不同的字节顺序可能性。
为什么你试图打印浮点数据,好像它是文本仍然是一个谜。