2011-12-20 2 views
0

Может ли кто-нибудь предложить мне, как преобразовать массив байтов в строку? Этот метод не работает:Изменения подписи

byte [] my_array=....; 
String my_string = new String (my_array); 

или

String my_string = my_array.toString(); 

То, что я хочу сделать, это преобразовать подписи в строку и передать его так с другой стороны. Но когда я использую метод выше и метод, тогда меняется подпись my_string.getBytes(), а затем не проверяется.

Я имею в виду, например, my_string изменения, когда я my_string.getBytes().toString() или my_array изменения после (new String(my_array)).getBytes()

Спасибо.

+0

Необходимо указать кодировку при преобразовании из массива байтов в String. Конструктор 'String (byte [] bytes)' использует кодировку по умолчанию для системы. Существует конструктор, содержащий массив и кодировку. – khachik

+0

Вам нужно уточнить, какие данные являются вашим вводом (byte [], но содержат что), какое «преобразование» вы хотите сделать и что вы хотите с ним делать (что «передает» другому? средний "). Почему вы не можете просто передать байт []? – Viruzzo

ответ

4

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

Вы делаете две вещи неправильно здесь:

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

Наиболее распространенный способ обработки произвольных двоичных данных в виде текста в обратимой форме - использовать base64. Там в домен base64 публичная библиотека Java here (и много других бесплатных вариантов тоже):

byte[] signature = ...; 
String signatureBase64 = Base64.encode(signature); 

// Propagate signatureBase64 to the other side, then... 

byte[] signature = Base64.decode(signatureBase64); 
+0

да, я использую это, например: Base64.encodeBase64 (подпись); возвращает массив байтов. Я использую импорт org.apache.commons.codec.binary.Base64; Какую библиотеку я должен использовать для работы с таким методом, как Base64.encode (подпись); спасибо – innspiron

+0

@innspiron: тот, на который я добавил ссылку в свой ответ ... у него лучший API, чем у Apache Commons Codec one, IMO. –

+0

Чтобы вернуть строку, используя библиотеку кодеков apache commons, вам нужно использовать Base64.encodeBase64String (byte [] input) // возвращает строку – viper

1

Оба new String() и getBytes() неявно используют кодировку платформы по умолчанию и перегружены, чтобы указать кодировку (который должен почти всегда сделайте). По-видимому, ваша стандартная кодировка платформы не может представлять все значения байтов в вашем массиве.

Но для преобразования байтов в строку и обратно почти всегда нужно делать что-то не так. Что именно содержит эта «подпись», и что это за «другая сторона», которую вы думаете, вам нужно преобразовать ее в String?

0

Вы должны кодировать массив байтов в Base64. Вы можете также использовать методы - printBase64Binary() и parseBase64Binary() из javax.xml.bind.DatatypeConverter для кодирования и декодирования Base64.

+0

работал :) спасибо всем. – innspiron

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