2015-10-26 1 views
2

У меня после многого устранения неполадок удалось получить кодер и декодер, где я вводил число, он превращает его в двоичный, а затем ASCII, возвращает это , Я передаю это в другое, он превращает ASCII в двоичную, а затем строки, которые относятся к числу. Это работает для всех чисел, которые не выглядят как 11xx xxxx, поскольку они превращаются в 10xx xxxx.Проблемы с getBytes, если крайний левый бит равен 1, следующий бит всегда 0

кодировщик:

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; 
} 

Decoder:

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

Вы не поняли, что кодировка символов делает. Выбросьте все с помощью метода getBytes() в декодере.

GetBytes() кодирует для UTF-8, который не один байт на символ. Если вы закодировали один байт на символ в кодере, вы декодируете один байт за символ в декодере.

Вы кодировщик вероломно свернутый кстати. Простая версия будет непосредственно разлагают Int в байтах и ​​приведение к обугливается:

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; 
} 

Все, что промежуточные преобразования ничего не добьются, но сделать код более запутанным и подверженным ошибкам.

Смежные вопросы