2013-12-14 2 views
5

я в настоящее время сложилась ситуация, когда я преобразующий строку символов ASCII:Преобразовать набор символов ASCII обратно в строку

 String str = "are"; // or anything else 

     StringBuilder sb = new StringBuilder(); 
     for (char c : str.toCharArray()) 
      sb.append((int)c); 

     BigInteger mInt = new BigInteger(sb.toString()); 
     System.out.println(mInt); 

где выход (в данном случае) 97114101 я изо всех сил, чтобы найти способ, как , инвертировать это, преобразовать строку символов ascii обратно в строку, например "are"

ответ

3

Вы не можете сделать это с десятичными числами, так как число цифр в их представлении изменяется. Из-за этого вы не сможете отличить последовательности 112 5 от 11 25 и 1 125.

Вы можете заставить каждого персонажа занимать ровно три цифры. В этом случае, вы должны быть в состоянии восстановить число обратно несколько раз деления на 1000, и взятие остатка:

for (char c : str.toCharArray()) { 
    String numStr = String.valueOf((int)c); 
    while (numStr.length() != 3) numStr = "0"+numStr; 
    sb.append(numStr); 
} 

Если вы используете только раздел ASCII точек UNICODE коды, это несколько расточительно, потому что значения, которые вам нужны, по большей части двузначны. При переключении на гекс, все точки ASCII код будет вписываться в двух цифр:

for (char c : str.toCharArray()) { 
    String numStr = Integer.toString(c, 16); 
    if (numStr.length() == 1) numStr = "0"+numStr; 
    sb.append(numStr); 
} 
BigInteger mInt = new BigInteger(sb.toString(), 16); 

Теперь вы можете использовать деление на 256 вместо 1000.

2

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

Вам нужен какой-то разделитель между цифрами.

2

Ответ большой . Вы не можете вернуть его с помощью существующего подхода.

Вместо этого у вас может быть целочисленный массив (, если возможно). Вы можете получить лучшее решение, если вы объясните, почему вы на самом деле .

2

Это может быть выполнено, если все символы, которые вы используете в строке, являются двузначными ASCIS. Например: «ARE» дало бы «658269», и вы бы знали, чтобы обрабатывать его двумя цифрами за раз, чтобы отменить его. Проблема здесь в том, что вы не сейчас, являетесь ли они кодами ASCI с двойной или тройной цифрой ....

Однако, если это чисто значения String [a-zA-Z], вы можете увидеть, будет ли двойная цифра находится в диапазоне [65-90] или [97-99], а также принимать тройную цифру, и она должна находиться в диапазоне [100-122].

Но само собой разумеется, что есть лучшие способы сделать это.

1

Как уже отмечалось, это не выполнимо в общий. Однако, как утверждают другие, это выполнимо, если вы делаете определенные предельные допущения. В дополнение к уже представленным, другое предположение может заключаться в том, что строки, которые вы конвертируете, - это все английские слова.

Тогда вы должны знать, что каждый символ занимает 2 или 3 цифры в целых числах.Следующий код иллюстрирует использование функции, которая проверяет, является ли исправны 2 цифры или должны ли вы рассмотреть 3 цифры:

public String convertBack(BigInteger bigInteger) { 
    StringBuilder buffer = new StringBuilder(); 

    String digitString = bigInteger.toString(); 

    for (int to, from = 0; from + 2 <= digitString.length(); from = to) { 
     // minimally extract two digits at a time 
     to = from + 2; 
     char c = (char) Integer.parseInt(digitString.substring(from, to)); 

     // if two digits are not enough, try 3 
     if (!isLegalCharacter(c) && to + 1 <= digitString.length()) { 
      to++; 
      c = (char) Integer.parseInt(digitString.substring(from, to)); 
     } 

     if (isLegalCharacter(c)) { 
      buffer.append(c); 
     } else { 
      // error, can't convert 
      break; 
     } 
    } 

    return buffer.toString(); 
} 

private boolean isLegalCharacter(char c) { 
    return c == '\'' || Character.isLetter(c); 
} 

Данный isLegalCharacter метод не очень сильный, но вы можете адаптировать его к вашим потребностям. Например, он не подходит для символов умляута, например, например, в слове «naïveté».

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

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