2014-12-02 2 views
2

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

Я пишу программу, которая преобразует строку в длинный вектор, который должен быть обратимым (чтобы прочитать информацию назад). Мне кажется, что преобразование в длинный массив. Я использую base 64 как средний шаг, чтобы сделать количество байтов более удобным, чтобы обрабатывать другие обрабатывающие части, которые я должен делать.

public long[] str2long(String s) 
    { 
     final byte[] authBytes = s.getBytes(StandardCharsets.UTF_8); 
     final String encoded = Base64.getEncoder().encodeToString(authBytes); 
     long[] array = new long[encoded.length()]; 
     int i=0; 
     for(char c: encoded.toCharArray()){ 
      array[i] = (long) c; 
//    System.out.print(array[i] + " "); 
      i++; 
     } 
     return array; 
    } 

Проблема заключается в том, что даже жесткая следующий код, как представляется точной инверсией кода выше, на самом деле это не так, а основание 64 назад преобразование дает эту ошибку: Illegal base64 character 5b.

public String long2str(long[] array) 
{ 
    char[] chArray = new char[array.length]; 
    int i=0; 
    for(long c: array){ 
     chArray[i] = (char) c; 
     i++; 
    } 
    String s = Arrays.toString(chArray); 
    final byte[] decoded= Base64.getDecoder().decode(s); 
    try { 
     s = new String(decoded, "UTF-8"); 
     return s; 
    } catch (UnsupportedEncodingException ex) { 
     Logger.getLogger(Encryption.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return null; 
} 

Итак, мои вопросы:

Что изменилось во втором методе, что мне не хватает? Я думаю, что это может быть StandardCharsets.UTF_8, но я не уверен.

Как это сделать long2str(long[] array) Работает как long2str(str2long(String s)) == String s?

Если вы хотите, я могу опубликовать тестовые примеры, которые я использую, чтобы попытаться проверить этот код.

ответ

1

В вашем long2str метод, изменения:

String s = Arrays.toString(chArray); 

к:

String s = new String(chArray); 

При использовании Arrays.toString() вы получаете String формы [Y, W, J, j, Z, G, V, m, Z, 2, h, ...], которая не является действительной базой 64 строк. Чтобы получить String, который содержит все символы chArray, вы должны использовать соответствующий конструктор String.

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