byte-Array als String übers http schicken

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Hallo zusammen,

ich komme bei folgendem Problem nicht weiter:

- Ich bilde von einer Datei die Prüfsumme via

Code:
private byte[] calcChecksum(OutputStream output) {

		MessageDigest digest = null;
		byte[] checkSum = null;
		try {
			digest = MessageDigest.getInstance("MD5");
			digest.update(output.toString().getBytes());
			checkSum = digest.digest();
		} catch (NoSuchAlgorithmException e) {
			logger.error("NoSuchAlgorithmException:");
			logger.error(e.getMessage());
			logger.error("Stacktrace: ", e);
			return null;
		}
		return checkSum;
}


Ich kriege also ein Byte-Array zurück.

Dieses wandle ich einen String um und URL-kodiere es noch:

Code:
String checkSum = URLEncoder.encode(new String(checkSumByteArray))

So, nun häng ich diesen String an meine restlichen URL-Parameter an und verschicke ihn über http (Die Kommunikation findet zwischen zwei Servlets statt)...

So weit, so schlecht, denn was dann bei meinem Empfänger-Servlet ankommt, sieht weder so aus wie CheckSumme nicht URL-kodiert, noch sieht es so aus wie die CheckSumme Url-kodiert.

Beispiel:

Checksumme vor URL-Kodieren und vor dem Verschicken als String:

Code:
\u0484@S\ufffdV\ufffd3\ufffdq\ufffd=\ufffdO\ufffd

Checksumme NACH URL-Kodieren und vor dem Verschicken als String:

Code:
%3F%40S%3FV%0E%3F3%3Fq%3F%3D%3FO%3F

Checksumme nach dem Empfang als String:

Code:
?@S?V?3?q?=?O?

Mir ist das alles so nicht ganz klar.....

Wie muss ich denn mit diesem Byte-Array umgehen um das über http übertragen zu können?

Ich danke schon mal jetzt für jede Hilfe!
 
S

SlaterB

Gast
%3F ist ein Fragezeichen und %40 ist sicherlich das @,
also klappt die Übertragung doch wunderbar,
oder willst du am Ziel wieder %3F haben?
normalweise freut sich doch jeder wenn daraus das Fragezeichen wird, so ist das Standard (soweit ich weiß)

die Übertragung scheint also ok,
man kann sich vorher noch fragen, ob die erste Kodierung korrekt war,
anscheinend nicht, denn \u0484 und \ufffd werden beide auf ? gemappt,
da ? oft für unbekannte Symbole steht, ist das sehr verdächtig

also die Frage an dich, welches Zeichen soll für \u0484 erscheinen?
ich nehme man unwissend an, dass es da nichts passendes gibt,
empfehle dir daher, dass manuell anders zu kodieren,
z.B. ein Zeichen \u0484 in die Zahl 45000 oder eine andere
(alle Unicode-Zeichen in eine Zahl von 0-64000 mappen)

dann die normalen Zahlen übertragen und beim Empfänger zurückmappen,

aber vielleicht gibts ja noch was ausgereifteres,
helfen google-Suchen a la 'Unicode-Zeichen im Web übertragen'?
 

jollyroger

Bekanntes Mitglied
Juchu,

ich hab noch keine Lösung, aber schon mal (wahrscheinlich) die wirkliche Ursache des Problems.

Erst mal danke für Tip mit UTF-8, das war schon mal ein Stups in die richtige Richtung....

Das hat aber leider so nicht funktioniert, obwohl ich explizit alles in UTF-8 kodiert bzw. dekodiert habe, kam bei der Empfängerseite immer was anderes raus....

Der Grund liegt vermutlich in der automatischen URL-Dekodierung durch den Tomcat.

Ein Beispiel was ich meine:

Auf der Senderseite hab ich einen String wie

Code:
String host = "foobar / 127.0.0.1";

Wenn ich auf dem String nun

Code:
URLEncoder.encode(host, "UTF-8");

aufrufe sehe ich in der - noch nicht abgeschickten - url

Code:
foobar%+127.0.0.1
(stimmt nicht so ganz, krieg die Kodierung aus dem Kopf gerade nicht mehr so hin, aber ihr wißt schon was ich meine)

Der wichtige Punkt nun:

Schaue ich mir nun auf der Empfängerseite den String an, sehe ich nun wieder

Code:
String host = "foobar / 127.0.0.1";

OHNE explizit

Code:
URLDecoder.decode(host, "UTF-8");

aufgerufen zu haben.

Und genau hier ist natürlich der Haken, auch wenn ich auf Empfängerseite sowas wie:

Code:
String checkSum = new String(request.getParamter(foo).getBytes("UTF-8"), "UTF-8")

mache klappts trotzdem nicht....

Hab dazu mal folgendes gefunden: klick

The trouble is that none of this charset information gets sent back to the web server during a GET or POST operation. The server has no way of knowing how to interpret the url-encoded GET parameters, so it assumes ISO-8859-1.

Werd in der Richtung mal weitermachen und mich wieder melden..............
 

jollyroger

Bekanntes Mitglied
Hallo nochmal,

eine Frage hätte ich dann doch noch.........:)

Was ich nicht verstehe, ist:

Ich hab eine byte-array mit der checksumme:

Code:
byte[] checksum;

Das packe ich nun so in meine Url:

Code:
URLEncoder.encode(new String(checksum, "UTF-8"), "UTF-8");

Beim Empfänger hole ich mir die checksumme so wieder:

Code:
String checksum = new String(request.getParameter(checksum).getBytes("UTF-8"), "UTF-8");

Das funktioniert wie schon gesagt nicht, es kommt eine andere checksumme raus.

Was ich halt daran nun nicht verstehe, ist:

Sogar wenn mir der Tomcat nun von mir aus meinen String in z.B. iso-8859-1 umwandelt, so müsste es mir doch trotzdem möglich denn Original-String durch obige Anweisung

Code:
String checksum = new String(request.getParameter(checksum).getBytes("UTF-8"), "UTF-8");

wieder zu kriegen, aber das klappt nicht?

Ich verstehe das nicht, geht da irgendwo Information verloren wenn der Tomcat das nicht als UTF-8 annimmt, oder warum kann ich den String nicht in den Original-Zustand "rekodieren"?
 
R

Roar

Gast
siehe meine antwort

Roar hat gesagt.:
new String(checkSum).getBytes("UTF-8")

ps: das:
String checksum = new String(request.getParameter(checksum).getBytes("UTF-8"), "UTF-8");
kannst du dir schenken, das hat genau 0 auswirkungen
 

jollyroger

Bekanntes Mitglied
Sorry, jetzt bin ich verwirrt..........

Mit

Code:
new String(checkSum).getBytes("UTF-8")

meinst du auf der Empfänger Seite sowas zu machen wie:

Code:
byte[] transmittedChecksum = new String(checkSum).getBytes("UTF-8");

? Das sehe ich richtig?
 
R

Roar

Gast
nochmal von vorne:
String s = URLEncoder.encode(new String(checkSum), "UTF-8") // oder ISO-8859-1 wenn du willst
beim sender reicht

und auf der empfängerseite musst du nichts machen, außer getPrameter()

digest.update(output.toString().getBytes());
is übrigens sinnlos, falls du dachtest das toString() liefert zurück, was du in den stream reingeschrieben hast. ansonsten is das natürlich ok, auch wenn ich nicht wüsste wozu man die checksumme davon brauchen würde ???:L
 

jollyroger

Bekanntes Mitglied
Hallo,

leider klappt hier immer noch gar nichts..... :(

@roar

Code:
digest.update(output.toString().getBytes());
is übrigens sinnlos, falls du dachtest das toString() liefert zurück, was du in den stream reingeschrieben hast.

Das tut es aber!

Angenommen, ich habe eine Textdatei in der nur "HUHU" steht.

Ich lese die so ein:

Code:
	private OutputStream readFile(File file) {
		
	   	logger.debug("Trying to read in file...");
	   	OutputStream outputStream = null;
	   	
		try {
			outputStream = new ByteArrayOutputStream();
			InputStream inputStream = new FileInputStream(file);
	        byte[] buffer = new byte[ CommonConstants.BLOCKSIZE ]; 

	        for ( int length; (length = inputStream.read(buffer, 0, CommonConstants.BLOCKSIZE)) != -1; ) 
	    	    outputStream.write( buffer, 0, length );		 
			 
	        inputStream.close();
	        System.out.println("outputStream to String: " + outputStream.toString());
	 
		} catch (FileNotFoundException e) {
			logger.error("FileNotFoundException:");
			logger.error(e.getMessage());
			logger.error("Stacktrace: ", e);
			return null;
		} catch (IOException e) {
			logger.error("IOException:");
			logger.error(e.getMessage());
			logger.error("Stacktrace: ", e);
			return null;
		}

Das

Code:
 System.out.println("outputStream to String: " + outputStream.toString());

liefert mir in der Tat: "HUHU".....

String s = URLEncoder.encode(new String(checkSum), "UTF-8") // oder ISO-8859-1 wenn du willst
beim sender reicht

und auf der empfängerseite musst du nichts machen, außer getPrameter()

Ich mache es jetzt genauso, leider klappt das auch nicht:

Ich hänge die Checksumme folgendermaßen an:

Code:
urlParamsEncoded += CommonConstants.URL_ARG_MD5_CHECKSUM + "=" URLEncoder.encode(new String(checkSum), "UTF-8")  + "&";

Und hole sie mir beim Empfänger wieder so ab:

Code:
sentCheckSum = new String(request.getParameter(CommonConstants.URL_ARG_MD5_CHECKSUM));

Leider ändert sich durch die Übertragung doch etwas:

Checksumme beim Sender direkt nach der Berechnung:

\u0484@S\ufffdV\ufffd3\ufffdq\ufffd=\ufffdO\ufffd

Url-encoded mit UTF-8 sieht es so aus:

%D2%84%40S%EF%BF%BDV%0E%EF%BF%BD3%EF%BF%BDq%EF%BF%BD%3D%EF%BF%BDO%EF%BF%BD

Beim Empfänger sieht sie nun so aus (einfach über getParameter geholt wie du gesagt hattest):

@S�V�3�q�=�O�

Berechne ich nun auf der Empfängerseite von dem übertragenen String "HUHU" erneut die Checksumme, so ist diese identisch zu der die ich anfangs beim Sender berechnet habe:

\u0484@S\ufffdV\ufffd3\ufffdq\ufffd=\ufffdO\ufffd

Aber natürlich schlägt der checksummen-test fehl, da sich die übertragene checksumme geändert hat......

Noch jemand ne Idee?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Byte-Array zu String Allgemeine Java-Themen 7
E Byte-Array to String: Zeichenkaputt Allgemeine Java-Themen 11
G String in byte- Array Allgemeine Java-Themen 3
LucasGlockner Effizienter byte-Zugriff auf ein long[]-Array Allgemeine Java-Themen 8
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
N Byte Array in Java "dekomprimieren" Allgemeine Java-Themen 3
R Byte Array Zeichensuche Allgemeine Java-Themen 6
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
R In einem Byte-Array nach einer gewissen Zahlenfolge suchen Allgemeine Java-Themen 7
A Input/Output Buffered Image zu Byte Array und zurück konvertieren Allgemeine Java-Themen 4
M byte array splitten Allgemeine Java-Themen 3
W CRC32 aus byte array Allgemeine Java-Themen 5
P Einzelne Bits in einem Byte-Array setzen Allgemeine Java-Themen 2
R int to byte[] Array Allgemeine Java-Themen 4
MQue byte[] Array to Integer Allgemeine Java-Themen 4
ARadauer Blob aus byte Array erstellen? Allgemeine Java-Themen 3
D datei in byte[]-array schreiben Allgemeine Java-Themen 6
MQue ArrayList in ein byte- Array Allgemeine Java-Themen 7
B ein spezielles Byte-Array sortieren Allgemeine Java-Themen 11
J byte-Array in Hashmap speichern? Allgemeine Java-Themen 3
B boolean array = byte array (platzverbrauch) Allgemeine Java-Themen 6
C Byte Array aus Datei erzeugen Allgemeine Java-Themen 6
T BufferedImage aus einem byte-Array? Allgemeine Java-Themen 2
H int aus Byte-Array erzeugen Allgemeine Java-Themen 10
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
Thallius unsigned byte Allgemeine Java-Themen 18
kodela Datentypen byte als unsigned interpretieren Allgemeine Java-Themen 23
W String -> byte[] -> String - Sieht jemand was ich nicht sehe? Allgemeine Java-Themen 10
TheWhiteShadow 2D-Grafik GIF Library mit byte output Allgemeine Java-Themen 10
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
kodela Byte Order Mark (BOM) bei readLine() ignorieren Allgemeine Java-Themen 5
A Byte zu String Allgemeine Java-Themen 4
RalleYTN Datentypen Unsignierter Byte zum signierten Byte Allgemeine Java-Themen 2
X Datentypen Byte geht nicht höher als 126 auch nicht mit casten? Allgemeine Java-Themen 22
M Null byte in verschiedenen charsets Allgemeine Java-Themen 2
D Decodierung von Mp3-byte[] Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
P Datentypen Warum überhaupt Byte ? Allgemeine Java-Themen 12
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
E Byte zu String & umgekehrt Allgemeine Java-Themen 3
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
M Chart per byte[] in JSP anzeigen Allgemeine Java-Themen 4
E int in byte Allgemeine Java-Themen 6
R ArrayList byte[] abspeichern Allgemeine Java-Themen 4
S byte [] in string und zurück konvertieren Allgemeine Java-Themen 2
G byte ? : Allgemeine Java-Themen 7
hdi Speicherbelegung byte, short, int Allgemeine Java-Themen 8
J byte - hex - byte.. casten Allgemeine Java-Themen 8
R byte[] to String Konvertieren Allgemeine Java-Themen 14
J Hex-String zu byte transformieren Allgemeine Java-Themen 7
T Zu doof für byte-Umrechnung ... Allgemeine Java-Themen 3
F byte[] aus einem BufferedImage Allgemeine Java-Themen 3
L byte -> byte[1] -> byte Allgemeine Java-Themen 2
Kr0e Synchronisieren: boolean,byte,char ? Allgemeine Java-Themen 2
S Überprüfung/Parsen eines Byte-Arrays Allgemeine Java-Themen 9
Semox Byte-Manipulation eines Bildes Allgemeine Java-Themen 7
Meldanor For-Schleifen - byte statt int? Allgemeine Java-Themen 11
C int zu byte cast - verständnis Allgemeine Java-Themen 3
MQue Byte to Int convertieren Allgemeine Java-Themen 2
R Double Werte aus byte[] auslesen Allgemeine Java-Themen 5
W Verwendung von byte Allgemeine Java-Themen 9
G zu lange Byte code dateien Allgemeine Java-Themen 6
E Byte [] nach hex, dann nach dec Allgemeine Java-Themen 2
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
G 2 x byte zusammenkopieren Allgemeine Java-Themen 7
G byte nach int Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
data89 Die Größe eines Strings in Byte berechnen? Allgemeine Java-Themen 12
G Byte- List mit einem Iterator durchlaufen Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
T "unsigned" byte[] -> BigInteger Allgemeine Java-Themen 2
F byte in hex-String oder: Wer hat in Mathe aufgepasst Allgemeine Java-Themen 3
T Socket Server Anwendung - Empfang eines Byte-Arrays Allgemeine Java-Themen 7
J NumberFormatException bei String->byte[] Allgemeine Java-Themen 12
T Object -> byte[] Allgemeine Java-Themen 5
G Byte[] zeichenweise lesen Allgemeine Java-Themen 4
G byte[] mit Strings füllen Allgemeine Java-Themen 2
B int -> byte Allgemeine Java-Themen 2
G file --> byte[] Allgemeine Java-Themen 7
E Problem beim Dateien kodieren ("Byte = Byte +1") Allgemeine Java-Themen 3
I String -> byte[] -> String Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue int in byte Allgemeine Java-Themen 18
G Maximalgröße von byte[] buffer Allgemeine Java-Themen 7
E String -> byte[] Allgemeine Java-Themen 6
C Byte[] to String Allgemeine Java-Themen 7
D byte[] problem Allgemeine Java-Themen 3
T OutputStream - Event bei Byte-Fluss Allgemeine Java-Themen 5
S Problem beim Einlesen von byte-werten aus datei Allgemeine Java-Themen 2
F List<String> zu byte[] Allgemeine Java-Themen 7
L byte vs. int Allgemeine Java-Themen 6
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
N Byte-Code entschlüsseln (Bitmasks?) Allgemeine Java-Themen 3
R byte - string? Allgemeine Java-Themen 10
R Stream Byte für Byte durchgehen Allgemeine Java-Themen 5
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
L byte[] to int Allgemeine Java-Themen 2
M Vector zu einem byte[] Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben