2011-01-06 12 views
2

Ich stieß auf ein Problem, das ich nicht herausfinden kann. Hier ist die Definition des Problems: Ich habe einige Daten in einer BLOB-Spalte in Db2/Linux-Umgebung. Blob wurde in DB2 geschrieben, nachdem das Byte [] mithilfe der JDK-Komprimierung komprimiert wurde (Code, der in der Linux-Umgebung ausgeführt wird). Ich versuche, ein einfaches Programm zu schreiben, um einige dieser Daten zu lesen, entpacken Sie es (mit JDK) und erstellen Sie eine Zeichenfolge aus dem dekomprimierten Byte-Array in Windows-Umgebung (meine Entwicklungsumgebung). Problem ist, dass nach dem Dekomprimieren des Blobs (byte []) die Länge des dekomprimierten Byte-Arrays normalerweise 1-3 Bytes länger ist als erwartet. Was ich unter erwartet verstehe, ist, dass die Offset- und Längenfelder auch in der Datenbank gespeichert werden. In diesem Fall ist die Länge des dekomprimierten Byte-Arrays normalerweise länger als die gespeicherte Länge in der Datenbank, nur ein paar Bytes. Wenn ich also ein String-Objekt aus dem dekomprimierten Byte-Array erzeuge und ein anderes String-Objekt mit der Teilzeichenkette (Offset, Länge) unter Verwendung der Offset- und Längenfelder aus der Datenbank erzeuge, ist mein zweiter String der String, den ich mit der Substring-Methode erhalten habe kürzer.Problem Auffüllen von Byte [] in Java?

Ein Beispiel wäre: Datenbank-Datensatz enthält einen Klecks, Offset: 0, Länge: 260.409 nach dem Blob Dekomprimieren -

compressedByte[].length - 71,212 
decompressedByte[].length - 260,412 
new String(decompressByte[]).length() - 260,412 
new String(decompressByte[]).subString(0, 260,409).length() - 260409 

Für einige anderen Eingabedatensätze ist der Unterschied, den ich zu sehen bin irgendwo zwischen 1-3 Bytes lang.

Ich bin etwas verwirrt mit diesem Problem und frage mich, ob jemand Tipps vorschlagen könnte, damit ich mehr Debugging tun kann, um dieses Problem herauszufinden. Ich frage mich, ob dies irgendwie damit zusammenhängen könnte, wie Bytes in Linux-Umgebungen gespeichert und geschrieben werden und wie sie in Windows gelesen werden? Danke für Ihre Hilfe.

Antwort

3

Ich vermute, dass die Standardcodierung zwischen den beiden Systemen unterschiedlich ist.

// on the linux box 
byte [] blob = str.getBytes("UTF-8"); 

// in your code 
String str = new String(blob, "UTF-8"); 

Oder zumindest herausfinden, was die Standard-Kodierung auf der Linux-Box ist (normal UTF-8) und überspringen Schritt 1.

Eine wirklich gute examplation von dem, was hier passiert werden konnte ist Joel on software

+0

+1 für die Erwähnung Joels Artikel. – Daniel

+0

Yup, das war es, es wurde anders codiert. Danke für deine Antwort. Mit neuen String (Byte [], "UTF-8") wurde das Problem behoben. Ich werde diesen Artikel heute Abend lesen - es sieht so aus, als wären dort viele gute Informationen drin. Schade, dass ich diese Antwort nicht abstimmen kann, da ich noch nicht genug Reputation habe. – John

+0

Sie können auf Ihre eigene Frage upvote (ich denke) auch Sie können das große Häkchen klicken, um diese Antwort als die akzeptierte Antwort zu markieren. Joels artical ist totales Gold und grundsätzlich zu lesen. –

2

Ein String ist kein allgemeiner Halter für Bytes. Sie werden zweifellos verschiedene Standardzeichenkodierungen zwischen Ihrer db2/Linux-Umgebung und Ihrer Windows-Umgebung haben, die dazu führen, dass die Konvertierung zwischen Bytes und Zeichen unterschiedlich sein wird.