bytes nach int (little endian bitshift)

Legion

Mitglied
hallo!

ich hab hier ein kleines problem...
ich will eine datei auslesen. es handelt sich dabei um eine binärdatei von einem älteren spiel. ich les die datei byte-weise aus. nur leider is das gelesene material totaler mist. deshalb liegt die vermutung sehr nahe, dass es little endian ist.

leider habe ich keine ahnung von diesem bitgeshifte...
ich bräuchte folgende funktionen:

2 byte -> short
2 byte -> unsigned short (int)
4 byte -> int

also die ausgelesenen bytes sind little endian und ich glaube die resultierenden zahlen (short/int) sollen es auch sein.
folgende funktion hab ich mit der suche gefunden:

[JAVA=4]
private static int toInt(byte b[])
{
return (b[0] & 0xFF) | ((b[1] & 0xFF) << 8) | ((b[2] & 0xFF) << 16) | ((b[3] & 0xFF) << 24);
}
[/code]

die erstellt zwar, nen int in little endian, aber die beachtet doch nicht, dass die bytes little endian sind?! ich bin verwirrt...
 

XHelp

Top Contributor
Big- und little endian gibt an, in welcher Reihenfolge sich die Bytes befinden. Ein Byte ist einfach nur ein Byte.

Und was meinst du mit "gelesenes Material ist mist"... woran merkst du es denn?
 
G

Gastredner

Gast
Die Konvertierung von Big nach Little Endian ist relativ einfach:
0x4711 in BE ist in LE 0x1147.
Code:
BE	|	LE
4711	|	1147
2342	|	4223
...	|	...
Die Bytes müssen praktisch nur umgekehrt gelesen werden. Wikipedia hat dies meiner Meinung nach auch recht gut erklärt.
 

Legion

Mitglied
@XHelp: ja, das was du geschrieben hast, weiss ich selber. wie "gastredner" richtig gesagt hat, die bytes muss man einfach umdrehen... dass das gelesene müll ist merke ich daran, dass teilweise negative und völlig unrealistische werte für zb. breite und höhe von einem bild rauskommen.

@gastredner: ja, ich weiss ziemlich genau wo der unterschied zwischen little endian und big endian liegt. google ist mir ein begriff. wenn ich in java mit nem input stream ein byte lese, is das aber big endian und meine frage war "wie wandle ich big endian in little endian um?". soll heissen wie kehrt man die reihenfolge um mit diesen bitshift operatoren?

nur zum verständnis, angenommen in der datei steht 10011111 10101010 und diese bytes wurden als little endian geschrieben. wenn ich das nun auslese, dann behandelt das java als 11111001 01010101 ?! und das is doch falsch?! also wie kehre ich das um und wie mache ich anschließend aus den umgekehrten bytes:

2 byte -> short
2 byte -> unsigned short (int)
4 byte -> int

edit:
ich habe bisher den datainputstream benutzt, der macht genau was ich brauch zb readUnsignedShort(). da die daten aber in little endian vorliegen kommt da mist raus.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
@XHelp: ja, das was du geschrieben hast, weiss ich selber.
Scheinbar nicht. Du musst die Reihenfolge der Bytes ändern und nicht die Reihenfolge von Bits.
Und du hast doch schon selber ein Beispiel gepostet, wie man es mit shift macht. Warum dann überhaupt die Frage?
Bist du dir sicher, dass du nicht einfach das Format falsch verstanden hast und wertest einfach nur falsche Daten aus?

P.S. In java sind alle primitiven Datentypen (bis auf char) vorzeichenbehaftet
 

Legion

Mitglied
danke für deine antwort.
ihr habt beide absolut recht. ich stand da total aufm schlauch. habs mir (zum 2. mal) bei wikipedia angeschaut. sry...

die daten lese ich schon richtig aus (denke ich) da ich da nach ner anleitung/spezifikation vorgehe. (utlima online grafik dateien, falls es jemanden interessiert...)
das code beispiel hab ich hier im forum gefunden und anscheinend is das das richtige für 4 byte -> int. leider versteh ich das mit dem bitshifts nicht 100%ig, deshalb kann ich die anderen funktionen die ich brauche nicht selber zusammenbasteln.
dass es in java kein unsigned gibt hab ich schon gemerkt, aber da gibts doch diesen "workaround", wo man einfach einen größeren typ verwendet, das würde mir auch reichen.
 

XHelp

Top Contributor
Nimm dir mal 4 bytes und mache es auf dem Papier. Dadurch wird dir der ablauf schon mal klar.
Ansonsten kannst du auch die selbe Methode verwenden, nur eben dein Byte-Array bei 2 Bytes mit noch zwei 0 auffüllen.
 

FerFemNemBem

Bekanntes Mitglied
Halloechen,

also wie kehre ich das um und wie mache ich anschließend aus den umgekehrten bytes:

2 byte -> short
2 byte -> unsigned short (int)
4 byte -> int


z.B. so:

Java:
private int byteArrayLittleEndianToInt(byte[] byteArray)
{
    return ByteBuffer.wrap(byteArray).order(ByteOrder.LITTLE_ENDIAN).getInt();
}

private short byteArrayLittleEndianToShort(byte[] byteArray)
{
    return ByteBuffer.wrap(byteArray).order(ByteOrder.LITTLE_ENDIAN).getShort();
}

Gruss, FFNB.
 

andiv

Bekanntes Mitglied
Wenn du vorzeichenlose 8-Bit Werte einlesen willst (in C unsigned char bzw. uint8_t), dann musst du in Java einen größeren Datentyp (short/int/long) verwenden:
Java:
byte b = read();
int i = b & 0xFF;
Wenn du das nicht machst dann wird der vorzeichenlose Wert als vorzeichenbehaftet betrachtet und du bekommst negative Werte.
 

Legion

Mitglied
Java:
private static short toShort(byte b1, byte b2)
{
	return (short)((b1 & 0xFF) | ((b2 & 0xFF) << 8));
}

private static int toUnsignedShort(byte b1, byte b2)
{
	return (b1 & 0xFF) | ((b2 & 0xFF) << 8);
}

private static int toInt(byte b1, byte b2, byte b3, byte b4)
{
	return (b1 & 0xFF) | ((b2 & 0xFF) << 8) | ((b3 & 0xFF) << 16) | ((b4 & 0xFF) << 24);
}

private static long toUnsignedInt(byte b1, byte b2, byte b3, byte b4)
{
	return (b1 & 0xFF) | ((b2 & 0xFF) << 8) | ((b3 & 0xFF) << 16) | ((b4 & 0xFF) << 24);
}

also so hauts hin, die ausgelesenen werte sind nun richtig. alle funktionen hab ich noch nicht getestet, aber toUnsignedShort und toInt gehn sicher. ausserdem haben paar tests ergeben, dass man um ca. 100% schneller is wenn man die funktionen oben nimmt statt einem dataInputStream und dessen .getInt()...
wenn man den dataInputStream einem bufferedInputStream übergibt ist man immernoch um über 50% schneller.

@FerFemNemBem: schau mal hier: Converting an unsigned byte array to an integer den 2. comment an. da steht, dass der weg über den ByteBuffer ca. 8x langsamer ist. jedes bisschen performanz wär mir aber recht.
 

XHelp

Top Contributor
Code:
toUnsignedShort(b1, b2)
ist das gleiche wie
Code:
toInt(b1,b2,0,0)
. Außerdem zweifle ich an der toUnsignedInt-Methode. Bei negativen Werten wird auch long negativ sein.
 

Legion

Mitglied
ah ok. ja gut, ich brauch die funktion einmal für 2 byte und einmal für 4 byte, aber das könnte man dann schöner machen bzw weniger redundant, das seh ich ein.

die toUnsignedInt hab ich aus den kommentaren von dem link, den ich gepostet hab. ich hab nur die reihenfolge für little endian geändert, aber sonst is das genau diese funktion. die leute dort meinen das würde so hinhauen...
meinst du, dass wenn ein byte negativ ist, dass dann der long auch negativ ist? ich glaube, dass "& 0xFF" die bytes unsigned macht bzw. negative werte ausschließt?!
 

XHelp

Top Contributor
Die Antwort dazu findest du in der JLS 5.1.2:
A widening conversion of a signed integer value to an integral type T simply sign-extends the two's-complement representation of the integer value to fill the wider format.
Bei byte&0xFF kommt ein int raus. bei int | int kommt ein int raus. Durch das ganze shiften ist es durch aus möglich, dass da eine negative Zahl rauskommt (nämlich wenn der höhste Bit bei b4 gesetzt ist). Wenn du es stillschweigend nach long castest (denn nichts anderes machst du), dann bleibt der negative Wert erhalten. Habe es zwar nicht getestet, aber sowas wird wohl funktionieren:
Java:
private static long toUnsignedInt(byte b1, byte b2, byte b3, byte b4)
{
    return ((b1 & 0xFF) | ((b2 & 0xFF) << 8) | ((b3 & 0xFF) << 16) | ((b4 & 0xFF) << 24))&0xFFFFFFFFl;
}
Das
Code:
l
am Ende ist wichtig
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
V Input/Output Austausch von Bytes zwischen C# und Java Allgemeine Java-Themen 3
RalleYTN Input/Output Clip als ein Array von Bytes? Allgemeine Java-Themen 2
J Temperatur aus bytes auslesen. Allgemeine Java-Themen 13
Q Bytes verschwinden im CipherInputStream Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
J Bytes aus Socket lesen Allgemeine Java-Themen 9
Q Datentypen Short aus Bytes - Signed -> Unsigned? Allgemeine Java-Themen 9
C Datentypen int in bytes zerlegen und wieder zusammen setzen Allgemeine Java-Themen 13
K Hexadezimale Bytes Allgemeine Java-Themen 6
B bereits gelesene Bytes herausfinden Allgemeine Java-Themen 10
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
S String zu binary und zurück - Problem mit unsigned/signed bytes Allgemeine Java-Themen 2
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
K AES, Buffer und Bytes Allgemeine Java-Themen 2
S Bytes oder Hex-Werte zu Assembler Code? Allgemeine Java-Themen 6
J Receive eines Hex-Bytes über COM-Port Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
M Bytes in Datei schreiben Allgemeine Java-Themen 10
T Spezielle Bytes in Datei schreiben Allgemeine Java-Themen 7
F Einlesen von Bytes Allgemeine Java-Themen 9
reibi Größe Array aus bytes Allgemeine Java-Themen 14
G RXTX verschicken einzelener Bytes Allgemeine Java-Themen 8
G WAV-Samples bearbeiten oder: 2 Bytes -> short -> float Allgemeine Java-Themen 5
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
G Mehrere Bytes auf einmal einlesen Allgemeine Java-Themen 4
P int -> 4 bytes Allgemeine Java-Themen 11
R Menge an Bytes eines OutputStreams ermitteln. Allgemeine Java-Themen 6
R Wieviele Bytes gesendet Allgemeine Java-Themen 3
T Bestimmte bytes in einer Datei ersetzen? Allgemeine Java-Themen 4
D 16-Bit int --> 2* 8-Bit Bytes Allgemeine Java-Themen 17
H Objekte verbrauchen immer mindestens 16 Bytes Allgemeine Java-Themen 3
W Array größer als 65536 Bytes Allgemeine Java-Themen 7
A RandomAccessFile - Bytes vom Anfang der Datei löschen Allgemeine Java-Themen 32
C Code of a method longer than 65535 bytes Allgemeine Java-Themen 3
L 8 bytes von bestimmter position weg lesen? Allgemeine Java-Themen 11
D 2 Bytes in ein int convertieren Allgemeine Java-Themen 2
B Umwandeln von Bytes in float Zahl (DataInputStream) Allgemeine Java-Themen 3
G 0 Bytes bei temporäre Datei. Warum? Allgemeine Java-Themen 6
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
J4n5chmiddi Methoden Website-URL im Browser öffnen nach erfolgreicher Basisauthentifizierung in Java Allgemeine Java-Themen 12
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
W Pdf verwerfen, weil Checkbox nach Unterschrift geaendert wurde Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
S Swing Speichern nach Button-Klick Allgemeine Java-Themen 5
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
M Java 8 nach Java 6 konvertieren Allgemeine Java-Themen 7
N Neustarten des Codes nach der Fehlermeldung Allgemeine Java-Themen 17
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java Allgemeine Java-Themen 7
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
C Config nach bestimmten Wertdurchsuchen. Allgemeine Java-Themen 2
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
The Pi 2D-Grafik Tic Tac Toe nach Gewinn rot Allgemeine Java-Themen 1
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
T Textarea nach nur 1 wort durchsuchen Allgemeine Java-Themen 3
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben