Метод строка в байт - PullRequest
       5

Метод строка в байт

1 голос
/ 15 ноября 2011

Я провожу весь день, пытаясь найти ответ, поэтому, наконец, я пишу здесь.Я шифрую одну строку с помощью класса crypto и получаю байт [].Я должен преобразовать этот байт в строку с помощью tostring (), чтобы загрузить в одну сеть.Мне нужно получить эту строку, расшифровать и получить исходную строку.Моя проблема связана с getBytes, который не возвращает тот же байт [] для расшифровки.

Мне нужно преобразовать исходную строку в byte [], зашифровать, получить возвращаемый байт [], преобразовать в строку и затемэту строку преобразовать в byte [] и получить тот же байт [] в зашифрованном виде.

Я стараюсь все, что было у меня на уме.Мне нужен какой-то метод, который с одной строкой всегда возвращает один и тот же байт [], а getbytes этого не делает.

Я добавляю один пример:

      String s2="this is an example";
      byte[] b1=s2.getBytes("UTF-8");
      byte[] b2=s2.getBytes("UTF-8");
      System.out.println("Byte s:"+b1);
      System.out.println("Byte s:"+b2);

Есть один метод, которыйодна строка дает один и тот же байт []?С getBytes (по крайней мере у меня) я получаю два разных байта [].Благодаря.

Ответы [ 6 ]

3 голосов
/ 15 ноября 2011

Вы неправильно поняли следующую строку

System.out.println("Byte s:"+b1);

Здесь мы неявно вызываем метод toString() для байтового массива.Это не возвращает содержимое массива.Вместо этого используйте:

System.out.println("Byte s:" + java.util.Arrays.toString(b1));

Это покажет вам содержимое байтового массива, который вы можете использовать для сравнения.

Использование метода String.getBytes(String) в порядке.Он возвращает два разных байтовых массива экземпляров , но оба имеют одинаковое содержимое.

@Test
public void testGetBytes() throws Exception {
    String s2 = "this is an example";

    byte[] b1 = s2.getBytes("UTF-8");
    byte[] b2 = s2.getBytes("UTF-8");

    Assert.assertEquals(b1, b2);
}
2 голосов
/ 15 ноября 2011

Можно ли пропустить преобразование в строку?Я имею в виду, вы можете отправить байт [] и получить байт [].Или вы можете закодировать byte [] с помощью base64 (который производит серию печатаемых символов), отправить его в виде строки, а затем декодировать его обратно из base 64 и получить оригинальный байт [].

2 голосов
/ 15 ноября 2011

Мне нужно преобразовать этот байт в строку с помощью tostring (), чтобы загрузить в одну сеть

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

2 голосов
/ 15 ноября 2011

Вам необходимо использовать String#getBytes(charsetName), который использует определенную кодировку символов.

byte[] bytes = string.getBytes("UTF-8");
// ...

Затем, чтобы восстановить строку, вам необходимо использовать конструктор String(bytes, charsetName), который принимает определенную кодировку символов.

String string = new String(bytes, "UTF-8");
// ...

В противном случае кодировка символов платформы по умолчанию будет использоваться для декодирования символов строки в байты. Кодировка символов платформы по умолчанию не обязательно одинакова на всех платформах. Одна платформа может использовать UTF-8, в то время как другая платформа, например, использует CP1252 или ISO-8859-1.

В качестве альтернативы вы можете использовать Base64 для кодирования / декодирования байтов в строку, совместимую с US-ASCII, чтобы она была совместима практически со всеми приличными кодировками символов, о которых знает мир.

1 голос
/ 15 ноября 2011

Вы пытались воссоздать строку и получить из нее байты, явно указав кодировку?

final String newString = new String(bytes, utf8_charset);
final byte[] bytes = oldString.getBytes(utf8_charset);
0 голосов
/ 15 ноября 2011

Проблема может возникнуть из-за того, что JDK не может правильно распознать набор символов. Используйте объявление:

public byte[] getBytes(String charsetName)

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

...