有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中将字节数组转换为字符串并返回后得到错误的结果

我有一系列处理字节数组的工作人员,但他们也必须接收字符串和字符数组并将其转换为工作方法work(@NotNull Object data, @NotNull Object prev)。因此,我将一个worker中的字节数组转换为字符串nextWorker.work(new String(result, "UTF-16BE"),this);,并将其转换为另一个worker in work方法,在该方法中,它将转换回字节数组if(data instanceof String){workingData = ((String)data).getBytes("UTF-16BE");},但在某些情况下,结果是错误的(我将byte arr size传递给N,然后将byte arr size传递给N-2或类似的内容,丢失的字节不是来自该数组的开头或结尾)。有谁能帮我解决这个问题,或者告诉我为什么会这样

byte[] result = new byte[]{0, 0, 0, 97, 63, -44, 55, -19, 51, 16, -39, -106, 0, 0, 0,
                18, 0, 0, 0, 9, 0, 63, -32, 0, 0, 0, 0, 0, 0, 32, 63, -84,
                113, -57, 28, 113, -57, 28, 114, 63, -84, 113, -57, 28, 113, -57, 28,
                115, 63, -84, 113, -57, 28, 113, -57, 28, 100, 63,
                -84, 113, -57, 28, 113, -57, 28, 117, 63, -84, 113, -57, 28, 113,
                -57, 28, 108, 63, -84, 113, -57, 28, 113, -57, 28, 109, 63,
                -84, 113, -57, 28, 113, -57, 28, 111, 63, -68, 113, -57, 28, 113, -57, 28, 0};
        byte[] result2 = new byte[]{0, 0, 0, 115, 63, -29, -103, 75, 42, 114, -97, 67, 0, 0, 0, 18, 0,
                0, 0, 11, -1, 63, -84, 113, -57, 28, 113, -57, 28, 0, 63, -36, 113, -57, 28, 113, -57, 28,
                32, 63, -84, 113, -57, 28, 113, -57, 28, 112, 63, -84, 113, -57, 28, 113, -57, 28, -2, 63, -84,
                113, -57, 28, 113, -57, 28, 114, 63, -84, 113, -57, 28, 113, -57, 28, 101, 63,
                -84, 113, -57, 28, 113, -57, 28, 105, 63, -84, 113, -57, 28, 113, -57, 28, 76, 63,
                -84, 113, -57, 28, 113, -57, 28, 109, 63, -84, 113, -57, 28, 113,
                -57, 28, 111, 63, -84, 113, -57, 28, 113, -57, 28, 0};

        try {
            Object data = new String(result, "UTF-16BE");
            byte[] workingData = ((String)data).getBytes("UTF-16BE");
            Object data2 = new String(result2, "UTF-16BE");
            byte[] workingData2 = ((String)data2).getBytes("UTF-16BE");
            System.out.println( Arrays.equals(result,workingData));
            System.out.println( Arrays.equals(result2,workingData2));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

共 (1) 个答案

  1. # 1 楼答案

    将编码从UTF-16BE更改为UTF-16LE解决了给定示例中的问题

        String data = new String(result, StandardCharsets.UTF_16LE);
        byte[] workingData = data.getBytes(StandardCharsets.UTF_16LE);
        System.out.println(Arrays.equals(result, workingData)); // true
    

    是否有理由首选UTF-16BE编码