Probleme mit Binärdaten

Status
Nicht offen für weitere Antworten.
J

Jörn

Gast
Hallo Leute!

Habe ein Problem mit dem Auslesen von Binärdaten aus einer MS-SQL Datenbank.

Zuerst einmal habe ich eine Abfrage auf die Tabelle gemacht und die Binärdaten in einem Result gespeichert. Die Daten sind als BLOB in der Datenbank gespeichert. Bei meiner Abfrage wurde ein Feld einer Spalte abgefragt.

Im Ergebnis sind 721*1201*2 = 1731842 bytes.

Man kann sich das wie eine Matrix vorstellen, indem es 721 Spalten und 1201 Zeilen gibt (hat jetzt nichts mit dem Aufbau der Tabelle zu tun). Die eigentlichen Daten bestehen dann aus jeweils zwei bytes (im Result stehen dann 1731842 bytes hintereinander).

Dieses Ergebnis möchte ich jetzt gerne verarbeiten, mir immer zwei bytes nehmen und diese dann zusammen in einen int-Wert konvertieren.

Hierbei arbeite ich mit zwei Schleifen. Eine äußere Schleife läuft ingesamt 721 mal, die innere 1201 mal über das Result.

Für die äußere Schleife sollen jetzt jeweils 2402 bytes aus dem Result entnommen werden, um davon 1201 mal 2 bytes zu entnehmen, die ich dann in einen int-Wert umwandeln möchte.

Die Frage ist nun: Wie kann ich aus meinem Result erst einmal 2402 bytes bekommen, um von dem aus auf immer zwei bytes zu gelangen, die ich dann in einen int-Wert umwandeln kann? Oder ist es besser, nur eine Schleife zu benutzen und dann aus dem Result immer zwei bytes zu nehmen und diese in einen int-Wert zu konvertieren?

ResultSet rSet = statement.executeQuery();

while (rSet.next()) {
for (int j = 0; j <= 720; j++) {
// hier vielleicht 2402 bytes aus dem rSet nehmen
// byte[] buff = new byte[2402];
for (int k = 0; k <= 1200; k++) {
// hier zwei bytes von buff nehmen und in einen int umwandeln
}
}
}

Leider habe ich von Binärdaten nicht allzu viel Ahnung und ich hoffe, es ist nicht allzu kompliziert beschrieben und mir kann jemand helfen.

Dank im voraus.

Gruß Jörn
 

snail69

Mitglied
ohne genau auf die binärdaten einzugehen hätte ich einen tipp:

du könntest in einer schleife diene daten bitweise & 0xff verknüpfen und dann immer 2 bytes nach links bzw. nach rechts schieben (<< bzw. >>). dann noch ein (int) cast.

gings dir darum?
 
J

Jörn

Gast
Hallo snail69!

Danke erst einmal für Deine Antwort.

Mir geht es eigentlich um Folgendes:

Aus meinem ResultSet möchte ich immer mit zwei bytes arbeiten. Die zwei bytes stehen in Wirklichkeit für eine int-Zahl zwischen -32768 und 32767.

Als Beispiel: Man speichert die Zahl 2000 über zwei bytes binär ab (0000011111010000). Aus diesen zwei bytes möchte ich nun wieder die Zahl 2000 erstellen.

Dabei will ich das erste byte nehmen und es in eine int umwandeln. Ebenso dann das zweite. Um wieder auf 2000 zu kommen, nehme ich den ersten int-Wert, multipliziere ihn mit 256 und addiere diese Summe mit dem zweiten int-Wert. Dann sollte ich wieder auf 2000 kommen.

Die Frage, die ich habe, ist, wie ich an die einzelnen bytes aus meinem ResultSet komme. Versuche schon seit Stunden etwas hinzubekommen. Das einzige, was ich bis jetzt aus einem byte bekam, war diese Gebilde: [B@5224ee, und weiß nicht, was das ist. Hier habe ich versucht, ein byte in einen Intergerwert umzuwandeln.

Ich hoffe, Du kannst jetzt damit etwas mehr anfangen.

Gruß Jörn
 

Murray

Top Contributor
Jörn hat gesagt.:
Das einzige, was ich bis jetzt aus einem byte bekam, war diese Gebilde: [B@5224ee, und weiß nicht, was das ist.
Das war kein byte (und auch kein Byte) , sondern ein byte-Array.

Wie sind die Bytes denn gespeichert? Stehen die tatsächlich in verschiedenen Spalten? Dann sollte sowohl ResultSet#getByte( int colIdx) als auch ResultSet#getByte( String colName) funktionieren. Oder stehen beide Bytes als byte[] in einer Spalte? Dann musst Du Dir das Array mit ResultSet.getBytes( int colIdx) oder ResultSet#getBytes( String colName) holen und es dann selbst elementweise auswerten (bb[0] * 256 + bb[1])
 

snail69

Mitglied
unter http://www.rgagnon.com/javadetails/java-0026.html findest du ein beispiel wie du unsignedByte nach int umwandeln kannst.

wenn du ein vorzeichen haben willst müsste es ohne große probleme noch einfacher gehen du nimmst byte[0] "00000111" und sagst, dass es ein int ist 8 stellen nach links geschoben
Code:
int var=unsignedByteToInt(byte[0]) << 8;
.damit hättest du platz geschaffen für "11010000". jetzt musst du nur addieren
Code:
var=var+unsignedByteToInt(byte[1]);

ich habe das jetzt nur trocken getippt ohne auszuprobieren. aber die richtung müsste ersichtlich sein. eigentlich wilsst du so etwas machen:

var inhalt: 00000000 00000000
00000000 00000111 (scheiben)
00000111 00000000 (addieren)
00000111 11010000

damit ersparst du dir das multiplizieren und das vorzeichen bit ist auch noch dabe.

falls das noch nicht ganz helfen konnte, schreibe und ich versuche es bei mir.

gruß
 
J

Jörn

Gast
Hallo snail69 und Murray!

Danke für die beiden Tipps. Genau das habe ich gesucht.

Hätte aber noch zwei Anmerkungen.

Erstens: Ist die Methode "unsignedByteToInt" eine vorhandene Methode unter Java? Als ich diese anwenden wollte, habe ich unter Eclipse immer eine Fehlermeldung bekommen, dass diese nicht zu finden sei. Habe dann die von der Seite "http://www.rgagnon.com/javadetails/java-0026.html" übernommen und in meinen Quellcode eingebaut. Hab dann anschließend noch mal in der Java-DOC nachgeschaut, wobei die Methode dort aber aufgelistet ist.

Zweitens: In meinem ResultSet steht nur das Ergebnis von einem Feld aus meiner Tabelle, da alle bytes hintereinander gesetzt sind. Bei mir sind es ungefähr 1700000 bytes. Auf den ResultSet laße ich dann zwei for-Schleifen los. Die äußere läuft 721 mal und holt in einem byte Array immer 2402 byte. Die innere Schleife (1201-Durchläufe) verarbeitet dann die 2402 bytes, indem immer zwei bytes genommen werden und in einen int verwandelt werden. Man könnte das mit einer Matrix vergleichen. Sollte aber auch über eine for-Schleife laufen, indem diese dann 865921 läuft. Das mit den zwei for-Schleifen ist nur für mich.

Ich hoffe, dass das so in Ordnung ist:

// Anzahl von bytes für die innere Schleife.
byte r[] = new byte[2402];

while (rSet.next()) {
// Anzahl der Reihen.
for (int j = 0; j <= 720; j++) {
r = rSet.getBytes("Bild");
// Anzahl der Spalten.
for (int k = 0; k <= 1200; k=k+2) {
// Verschiebt das byte[x] um acht Stellen nach links und wandelt es in eine "int" um.
intWert = unsignedByteToInt(r[k+1]) << 8;
// Das zweite byte wird rechts angehängt.
intWert = intWert + unsignedByteToInt(r[k]);
}
}
}

Bin mir in einem nämlich noch nicht ganz so sicher, ob in "r" beim zweiten Durchlauf nicht die gleichen bytes drinstehen wie beim ersten Durchlauf. Wenn der Datensatzzeiger beim ersten Durchlauf auf "rSet" vor byte Null liegt und es werden 2402 bytes genommen, liegt der Datensatzzeiger im zweiten Durchlauf dann vor dem 2403 byte? In "r" passen ja nur 2402 bytes.

Gruß Jörn
 

Murray

Top Contributor
Ich habe das immer noch nicht genau verstanden. Auf jeden Fall hat r während aller Durchläufe der äußeren Schleife immer den gleichen Wert; es reicht, sich den Wert einmal zu holen. Erst, wenn das ResultSet#next aus der While-Bedingung durchlaufen wurde, gibt es ein neues r.

Wie ist das Result-Set strukturiert? Gibt es für ein Bild genau ein Feld, in dem das gesamte Bild als Byte-Array abgelegt ist? Das wird nicht bei allen Datenbanken funktionieren; dafür müsste man Blobs verwenden.
Oder das Bild bereits in Zeilen zerlegt, so dass immer mehrere Felder für ein Bild gelesen werden müssen?

BTW: wenn Du Java-Code postest, solltest Du ihn mit Code-Tags einrahmen.
 
J

Jörn

Gast
Hi Murray!

Danke für den Tipp bei dem ResultSet. Hatte ich ja auch schon vermutet. Hab ich jetzt aber in den Griff bekommen.

Das mit den Code-Tags merk ich mir auch.

Zum Schluß: ja, das gesamte Bild liegt in einem Feld einer Spalte als Byte-Array vor. Dafür benutze ich den Datentyp BLOB im SQL-Server.

Gruß Jörn
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C Probleme mit javax.mail.Session Allgemeine Java-Themen 8
M tomcat probleme Allgemeine Java-Themen 1
N Division macht Probleme Allgemeine Java-Themen 14
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
MarvinsDepression Probleme mit relativem Dateipfad Allgemeine Java-Themen 1
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
nibe1501 GUI Probleme Allgemeine Java-Themen 16
C Probleme mit dem WindowBuilder Allgemeine Java-Themen 3
P Selenium . Probleme ein Iron Icon Element anzusprechen Allgemeine Java-Themen 2
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
K VisualVM Profiling Remote Probleme Allgemeine Java-Themen 1
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
M Probleme bei Eclipse wenn ich entpacke Allgemeine Java-Themen 15
D Regex Probleme Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
Dann07 Probleme mit OpenAL Allgemeine Java-Themen 0
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
V Compiler-Fehler Online Compiler Probleme Allgemeine Java-Themen 4
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
M Probleme mit BigDecimal Allgemeine Java-Themen 1
T Probleme mit NumberFormat Allgemeine Java-Themen 5
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
K Data Konverter - Probleme mit Byte[] Kodierung Allgemeine Java-Themen 3
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
H Swing HashMap zu Tabelle macht mir Probleme Allgemeine Java-Themen 4
Neoline Interpreter-Fehler Probleme mit Arrays.toString Allgemeine Java-Themen 7
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
J Erste Schritte Probleme mit der Hauptklasse Allgemeine Java-Themen 14
J Tetris Probleme bei Klassen Allgemeine Java-Themen 14
J MinMax VierGewinnt Probleme Allgemeine Java-Themen 22
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
R Snake Probleme Allgemeine Java-Themen 2
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
RalleYTN 3D Objekt Translation basierend auf Rotation (Probleme mit Z Rotation) Allgemeine Java-Themen 0
Bluedaishi Druck Probleme mit PDF dateien Allgemeine Java-Themen 4
G Ant Probleme bei einer Installation die Apache ant+ivy verwendet Allgemeine Java-Themen 14
E TableView Probleme Allgemeine Java-Themen 7
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
K Threads Runtime und Process Probleme Allgemeine Java-Themen 3
S Probleme mit unterschiedlichen Java-Versionen (Mac OS X 10.11) Allgemeine Java-Themen 0
S Event Handling keyPressed()-Probleme Allgemeine Java-Themen 2
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
P Probleme mit Grafik (Java) Allgemeine Java-Themen 6
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
H Probleme mit DAY_OF_WEEK Allgemeine Java-Themen 4
Arif Probleme mit NullPointerException Allgemeine Java-Themen 2
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
RalleYTN Probleme mit Encrypting Allgemeine Java-Themen 10
M Probleme mit Schriftarten PDFBox Allgemeine Java-Themen 3
J Probleme mit der Java-Runtime Allgemeine Java-Themen 10
G Probleme mit BufferedWriter und URL Allgemeine Java-Themen 4
S Probleme mit meinem MacBook Pro DRINGEND HILFE erbeten! Allgemeine Java-Themen 17
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
M Runtime.exec() verursacht auf manchen Systemen Probleme - Ursache unklar Allgemeine Java-Themen 2
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
R DBUnit Performance Probleme Allgemeine Java-Themen 0
S Probleme mit Collection Allgemeine Java-Themen 7
L Probleme mit Jar Allgemeine Java-Themen 6
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K OOP OOP Gui Spiel + Vererbungen Probleme durch Nichtwissen!! Allgemeine Java-Themen 1
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
J Synchronized Probleme Allgemeine Java-Themen 7
J Java Progressbar & Download Probleme Allgemeine Java-Themen 10
S Probleme mit dem filechooser Allgemeine Java-Themen 1
J Comperator Probleme Allgemeine Java-Themen 4
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
S Probleme mit Webappplikation Allgemeine Java-Themen 5
L Plötzlich Probleme mit der JVM :( Allgemeine Java-Themen 6
S starke performance probleme des forums Allgemeine Java-Themen 10
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
R JRE Ablaufdatum seit 7u10 - Probleme bei selbst ausgelieferter JRE bekannt? Allgemeine Java-Themen 3
H Reg Exp Probleme Allgemeine Java-Themen 5
M Classpath Probleme bei JAR Generierung Allgemeine Java-Themen 2
S Probleme mit JAVA-Installation Allgemeine Java-Themen 3
D Probleme bei for-Schleife Allgemeine Java-Themen 4
R Probleme mit Javadoc Allgemeine Java-Themen 2
G Gson Probleme Allgemeine Java-Themen 2
P KI für TicTacToe programmieren > Probleme Allgemeine Java-Themen 2
M Google App Engine macht Probleme Allgemeine Java-Themen 4
H Probleme mit finally-Block und close() Allgemeine Java-Themen 4
F 2d array probleme Allgemeine Java-Themen 2
M 3D-Grafik Probleme beim drehen von Objekten Allgemeine Java-Themen 9
T Interface Probleme Allgemeine Java-Themen 8
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
M Probleme mit String in Label übergeben. Allgemeine Java-Themen 6
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
U Probleme mit Kopiervorgang Allgemeine Java-Themen 3
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben