Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字节中的字符串无法转换为等效字符串_Java_Arrays_Byte - Fatal编程技术网

Java 字节中的字符串无法转换为等效字符串

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

我注意到了

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 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重定向到这一点,即数据的长度不等于存储数据的数组的长度。