getBytes出现问题,如果最左边的位为1,则下一位始终为0

时间:2015-10-26 15:32:40

标签: java ascii

我经过大量的故障排除后设法让编码器和解码器工作,我输入一个数字,然后把它变成二进制然后是ASCII,返回它,我将它输入另一个,它将ASCII转换为二进制然后将这些字符串转换为数字。这适用于所有不像11xx xxxx的数字,因为它们变成了10xx xxxx。

编码器:

public static String convert(int number) {
    String binary = Integer.toBinaryString(number);
    String string = "";
    byte[] bytes = new byte[4];

    while (binary.length() < 32) {
        binary = "0" + binary;
    }

    for (int i = 0; i < bytes.length; i++) {
        string += (char) Integer.parseInt(binary.substring(i * 8, (i + 1) * 8), 2);
    }

    return string;
}

解码器:

public static int convert(String message) {
    byte[] bytes = new byte[message.length()];
    try {
        for (int i = 0; i < message.length(); i++) {
            bytes[i] = (message.substring(i, i + 1).getBytes("UTF-8"[message.substring(i, i + 1).getBytes("UTF-8").length - 1]);
        }
        StringBuilder binary = new StringBuilder(32);
        String s;
        for (int i = 0; i < bytes.length; i++) {
            s = Integer.toBinaryString(bytes[i] & 0xFF);
            while (s.length() < 8)
                s = "0" + s;
            binary.append(s);
        }
        int result = 0;
        result = Integer.parseInt(binary.toString(), 2);
        return result;

    } catch (UnsupportedEncodingException e) {
        return -1;
    }
}

1 个答案:

答案 0 :(得分:1)

您误解了字符编码的作用。在解码器中使用getBytes()抛出所有内容。

getBytes()编码为 UTF-8,不是每个字符一个字节。如果您在编码器中为每个字符编码一个字节,则在解码器中为每个字符解码一个字节。

你的编码器是非常错综复杂的btw。简单的版本是直接将int分解为字节并转换为char:

String encode(int i) {
    char[] result = new char[4];
    char[0] = (char) (i >>> 24);
    char[1] = (char) ((i >> 16) & 0xFF);
    char[2] = (char) ((i >> 8) & 0xFF);
    char[3] = (char) (i & 0xFF);
    return new String(result);
}

解码器也可以简单得多:

int decode(String s) {
    int result = 0;
    for (int i=0; i<s.length; ++i) {
        char c = s.charAt(i);
        if (c > 255)
            throw new IllegalArgumentException("invalid character: " + c);
        result = (result << 8) | (c & 0xFF);
    }
    return result;
}

所有中间转换都不会产生任何结果,只会使代码更容易混淆和容易出错。