Java 字节中的字符串无法转换为等效字符串
我注意到了 1) 我使用getByte()方法得到的字节数组是不同的 2) 尽管a和b的字符串(来自代码)完全相同,但它们并不相等 以下是我从四条打印语句中获得的输出:Java 字节中的字符串无法转换为等效字符串,java,arrays,byte,Java,Arrays,Byte,我注意到了 1) 我使用getByte()方法得到的字节数组是不同的 2) 尽管a和b的字符串(来自代码)完全相同,但它们并不相等 以下是我从四条打印语句中获得的输出: public class MyClass{ static final String BROADCAST = "Broadcasting"; public static final int PORT = 12344; public static String host = "localhost"; public static vo
public class MyClass{
static final String BROADCAST = "Broadcasting";
public static final int PORT = 12344;
public static String host = "localhost";
public static void main(String[] args) {
// TODO Auto-generated method stub
DatagramSocket serverSocket;
try {
serverSocket = new DatagramSocket(PORT);
InetAddress addr = InetAddress.getByName(host);
byte[] sendData = BROADCAST.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, //data byte array
sendData.length, //number of bytes
addr, //destination host address
PORT); //destination port
serverSocket.send(sendPacket);
byte[] rcvData = new byte[1024];
DatagramPacket rcvPacket = new DatagramPacket(
rcvData, rcvData.length);
//packet gets filled in by receive
serverSocket.receive(rcvPacket);
//Why the two Strings are not the same?
//Why the bytes derived from the same string different?
byte[] a = rcvData;
byte[] b= BROADCAST.getBytes();
System.out.println(a.equals(b));
System.out.println(new String(a));
System.out.println(new String(b));
System.out.println((new String(a).equals(new String(b))));
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我认为通过trim()的帮助,您可以实现您的期望。可能是字节a和b的大小不同,请在将字节转换为字符串时使用trim()
false
Broadcasting
Broadcasting
false
我认为通过trim()的帮助,您可以实现您的期望。可能是字节a和b的大小不同,请在将字节转换为字符串时使用trim()
false
Broadcasting
Broadcasting
false
您的接收代码不正确,因为传入的数据包并不总是与您的接收缓冲区大小相同。因此,在将数据转换为字符串时,需要限制数据的长度,否则,也会转换垃圾
byte[] a = rcvData;
byte[] b= BROADCAST.getBytes();
System.out.println(new String(a).trim());
System.out.println(new String(b).trim());
System.out.println((new String(a).trim().equals(new String(b).trim())));
然后,您确实在比较发送和接收数据包的内容。您的接收代码不正确,因为传入数据包的大小并不总是与接收缓冲区的大小相同。因此,在将数据转换为字符串时,需要限制数据的长度,否则,也会转换垃圾
byte[] a = rcvData;
byte[] b= BROADCAST.getBytes();
System.out.println(new String(a).trim());
System.out.println(new String(b).trim());
System.out.println((new String(a).trim().equals(new String(b).trim())));
然后您就可以准确地比较发送和接收数据包的内容。代码中存在问题 弗斯特 您的代码:
byte[] a = rcvData;
byte[] b = BROADCAST.getBytes();
String recStr = new String(rcvData, 0, rcvPacket.getLength());
System.out.println(recStr.equals(new String(b)));
应:(如果不是功能要求)
第二
您的代码:
byte[] rcvData = new byte[BROADCAST.getBytes().length];
它应当:
System.out.println(a.equals(b));
您的代码中存在问题 弗斯特 您的代码:
byte[] a = rcvData;
byte[] b = BROADCAST.getBytes();
String recStr = new String(rcvData, 0, rcvPacket.getLength());
System.out.println(recStr.equals(new String(b)));
应:(如果不是功能要求)
第二
您的代码:
byte[] rcvData = new byte[BROADCAST.getBytes().length];
它应当:
System.out.println(a.equals(b));
您不能使用调试器查看
real
数据吗?rcvData是长度为1024的字节[],而“Broadcasting”.getBytes()必须更短。另外,这不是比较数组的方式(你应该使用arrays.equals(arr1,arr2))。既然a
的长度是1024,而b
的长度(很可能)是12,你怎么能期望这两者相等?但实际上情况更糟,因为可以在使用String(byte bytes[],long off,long len)构造函数为套接字接收的数据获取字符串时看到这一点<代码>新字符串(rcvData、rcvPacket.getOffset()、rcvPacket.getLength())我建议通过执行System.out.println(arrays.toString(arr))打印数组。您还可以通过执行System.out.println(“@”+str+“@”);来打印字符串,以查看两端是否有空格。您是否可以使用调试器来查看real
数据?rcvData是长度为1024的字节[],而“Broadcasting”.getBytes()必须更短。此外,这不是比较数组的方式(您应该使用Arrays.equals(arr1,arr2))。既然a
的长度是1024,而b
的长度(很可能)是12-您怎么能期望这两个长度相等?但实际上情况甚至更糟,因为在使用字符串时可以看到(byte bytes[],long off,long len)构造函数获取套接字接收到的数据的字符串。新字符串(rcvData,rcvPacket.getOffset(),rcvPacket.getLength())
我建议通过System.out.println(arrays.toString(arr))打印数组。您也可以通过System.out.println(“@”+str+“@”)打印字符串;查看两端是否有空白。trim()
如果正在使用的缓冲区包含上一个接收数据包,而该数据包比当前数据包长,则将无法工作。trim()
如果使用的缓冲区包含比当前数据包长的前一个接收数据包,则该缓冲区将不起作用。我认为OP正在测试发送和接收DatagramPacket
。假设客户端将以可变大小发送数据包,服务器将不知道其他数据包的大小。因此,如果您定义数组大小正好等于发送数组的大小。是的,你是对的@Alex,但如果是这样的话,那么你的代码在长数据的情况下也不会工作。在这种情况下,我们需要使用循环从流中检索数据,你是对的兄弟…!我只是想将@Shixu Zhang重定向到这个点,即数据的长度不等于存储该数据的数组长度。我认为OP正在测试发送和接收DatagramPacket
。假设客户端将以可变大小发送数据包,服务器将不知道其他数据包的大小。因此,如果将数组大小定义为与发送数组大小完全相同,则没有意义。是的,您将e right@Alex但如果是这样的话,那么你的代码在长数据的情况下也不起作用。在这种情况下,我们需要使用循环从流中检索数据,你是对的,兄弟!我只是想将@Shixu Zhang重定向到这一点,即数据的长度不等于存储数据的数组的长度。