2013-07-10 16 views
15

Jak przekonwertować tablicę z bytes na String bez konwersji ?.Jak przekonwertować tablicę bajtów na ciąg w Javie?

Próbowałem:

String doc=new String(bytes); 

ale plik doc nie jest taka sama, niż bajtów (bajty są informacje binarne). Na przykład:

String doc=new String(bytes); 
    byte[] bytes2=doc.getBytes(); 

bytes i bytes2 są różne.

PS: UTF-8 Nie działa, ponieważ konwertuje kilka bajtów na różne wartości. Testowałem i to nie działa.

PS2: I nie, nie chcę BASE64.

+0

musisz użyć właściwego kodowania – nachokk

+0

@TheNewIdiot odpowiedź w tym poście nic nie rozwiązuje. Życzyłbym sobie konwersji bajt po bajtach, a odpowiedź brzmi "przekonwertuj lub zniszcz". Jak to możliwe, że Java nie może tego zrobić ?. – magallanes

+0

Java dokonuje doskonałego rozróżnienia między danymi binarnymi (bajtami) a tekstem (String). W przypadku tekstu wybrał wewnętrzny kod Unicode, więc wszystkie języki są uwzględnione. Chociaż możesz użyć kodowania jak ISO-8559-1 do konwersji bajtów, tak jak do String i odwrotnie, te Struny mogą mieć artefakty podobne do binarnych 0. –

Odpowiedz

13

musisz określić kodowanie chcesz np UTF-8

String doc = .... 
byte[] bytes = doc.getBytes("UTF-8"); 
String doc2 = new String(bytes, "UTF-8"); 

doc i doc2 będzie taki sam.

Aby odkodować kod byte[], musisz wiedzieć, jakie kodowanie zostało użyte, aby upewnić się, że będzie ono poprawnie dekodowane.

9

Oto jeden sposób przekonwertować tablicę bajtów do String i tył:

String doc=new String(bytes, "ISO-8859-1"); 
byte[] bytes2=doc.getBytes("ISO-8859-1"); 

String jest ciągiem znaków, więc trzeba jakoś kodować bajty jako znaki. Kodowanie ISO-8859-1 mapuje pojedynczą, unikalną postać dla każdego bajtu, więc można go bezpiecznie użyć do konwersji. Zauważ, że inne kodowania, takie jak UTF-8, nie są bezpieczne w tym sensie, ponieważ istnieją sekwencje bajtów, które nie odwzorowują poprawnych łańcuchów w tych kodowaniach.

+0

Działa to w Javie, ponieważ nawet binarny 0 (terminator C string) działa dobrze. –

+0

Bardzo mi pomógł! W przeciwnym razie walczyłbym z bajtem []! – AVA

+2

Dobra wskazówka dotycząca kodowania "ISO-8859-1". – tarka

1

"Prawidłowa konwersja" między bajtem [] i String jest jawnym określeniem kodowania, którego chcesz użyć. Jeśli zaczynasz od bajtu [] i nie zawiera on danych tekstowych, nie ma "właściwej konwersji". Łańcuchy są dla tekstu, bajt [] jest dla danych binarnych, a jedyną sensowną rzeczą do zrobienia jest uniknięcie konwersji między nimi, chyba że absolutnie musisz.

Jeśli naprawdę musisz użyć ciągu do przechowywania danych binarnych, najbezpieczniejszym sposobem jest użycie kodowania Base64.

Source Michael Borgwardt

+0

Co jeśli łańcuch jest tylko reprezentacją? i po konwersji z powrotem do tablicy bajtowej używamy właściwych metod konwersji? – Eftekhari

Powiązane problemy