Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :(

sirbender

Top Contributor
Hi,

ich habe gerade folgendes Problem:

ich muss ein byte[] in einen String konvertieren:

Java:
String data = new String(bArray, "UTF-8");
System.out.println(bArray.length);
System.out.println(data.length());
byte[] restored = data.getBytes("UTF-8");
System.out.println(restored.length);

Die Programmausgabe ist:
6264
6214
7710

D.h. durch die Konvertierung ist bArray und restored nicht identisch 🙁

Was ist da los? Wie kann ich es verhindern?

Danke,
sb
 
Reduziere doch mal deine Eingangsbytes bis es < 10 sind. Entweder du siehst dann sofort selbst was mit den Bytes nicht stimmt, oder du postest diese hier und wir sehen weiter. Alles andere ist raten...
 
Ok...ich habe mal ein Minimales Beispiel geschrieben. Eigentlich sollte es egal sein, da ich ein byte[] reinfuettere. Das ist schon ein richtiges byte[] -- es sollte also alles stimmen. Da ich das CharSet zum encodieren und dann auch decodieren angebe sollte ebenfalls alles funzen.

Tut es aber nur wenn ich charSet = "ISO-8859-1" nutze. Bei charSet = "UTF-8" ist der Array nach der Konvertierung nicht mehr identisch.

Java:
	public static void main(String[] args) throws UnsupportedEncodingException {
		byte[] bArray; 
		bArray = new byte[] {0,1,0,0,0,13,0,-128,0,3,0,80,70,70,84,77,-56,-66,-115};
				
		String charSet;
		charSet = "ISO-8859-1";
		charSet = "UTF-8";
		
		String data = new String(bArray, charSet);
		System.out.println(bArray.length);
		System.out.println(data.length());
		
		byte[] restored = data.getBytes(charSet);
		System.out.println(restored.length);
		
		System.out.println(Arrays.toString(bArray));
		System.out.println(Arrays.toString(restored));
		System.out.println("bArray == restored: " + Arrays.equals(bArray, restored));
	}
 
Im UTF-8 werden die nicht als gültiges Zeichen darstellbaren Werte durch den Unicode replacement character (FFFD) ersetzt. Deine negativen Zahlen werden dadurch zu [-17, -65, -67], was dezimal eben diesem replacement character entspricht.
 
Zuletzt bearbeitet:
Aua!

Ich nehme an es gibt keine Loesung?!

Ich erhalte das byte[] schon UTF-8 encodiert. Ich nehme an, dass an diesem Punkt, die Originaldaten bereits unwiederbringlich 'verloren' sind, oder?
 
Woher bekommst du dein im UTF-8 encodiertes byte[] und was soll es überhaupt repräsentieren?
In obigem Beispiel reicht ein System.out.println(new String(bArray, "UTF-8")) aus, um zu sehen, dass bereits dein ursprüngliches byte[] nur Kauderwelsch enthält. Vor allem dieses "�" dürfte nicht vorkommen und zeigt an, dass aus Sicht von UTF-8 ein Fehler vorliegt.
 

Zurück
Oben