我经过大量的故障排除后设法让编码器和解码器工作,我输入一个数字,然后把它变成二进制然后是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;
}
}
答案 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;
}
所有中间转换都不会产生任何结果,只会使代码更容易混淆和容易出错。