16Bit Integer aus ByteArray im Little Endian Format

Status
Nicht offen für weitere Antworten.
B

Bimbam

Gast
Hallo,
ich möchte ein Programm erstellen, dass Bytes aus einer Datei ausliest.
Das kriege ich noch hin. Doch ich scheitere daran, dass jeweils 2 Bytes zu einer 16Bit Integerzahl zusammengelegt werden, und das im LittleEndian Format.
Wie geht das am besten?
Vielen Dank!
 
S

SlaterB

Gast
beide Bytes in int umwandeln,
evtl auf den Zahlbereich achten: -128 bis +127 vs 0 bis 255

dann ein int shiften << 8 und den anderen addieren
 
G

Guest

Gast
danke.
das mit dem shiften << habe ich schon öfters gelesen, was genau ist das?
und wieso addieren? ich addiere die Zahlen ja nicht ich hänge ihre Bytes nur aneinander.
Gibt es keine KLase dafür (in .Net z.b. BitConverter). Was ist denn mit der KLasse ByteBuffer,
kann die sowas nicht? Davon habe ich nämlich mal was gelesen ...
 
S

SlaterB

Gast
tja, da hast du mehr gelesen als ich, kann dazu nix sagen ;)
<< verschiebt die Bits

das Shiften wie das Addieren ist wie im Zehner System:
Zahl 3566
-> Bytes 66 + 35

35 shiften zu 3500

3500
+
66
=3566 wie gewüsncht
 

quippy

Bekanntes Mitglied
Das besser Verfahren statt der Addition ist das binäre OR. Um sauber mit negativen Zahlen arbeiten zu können, ist die Maskierung mit dem binären AND notwendig.

Da Du Litte Endian wünschst (also kleinstes Byte ist zuerst im "Stream"), musst Du wie folgt vorgehen:

Code:
byte [] yourArray;
int size = yourArray.length>>1; // gleich / 2
int [] resultArray = new int[size];

for (int index=0; i<size; i++)
{
   int index = i<<1;
   resultArray[i] = ((byte)(yourArray[index] & 0xFF)) | (((byte)(yourArray[index+1] & 0xFF))<<8) & 0xFFFF;
   // Signed nachvollziehen:
   if ((resultArray[i] & 0x8000) != 0) resultArray[i] |= 0xFFFF0000;
}

Das Zweierkomplement wird hier nachträglich getrickst, da andernfalls keine negativen Zahlen kommen würden.

Was ist Shiften?!
Das mit dem Shiften ist im Zehnersystem auch möglich. Dort kommt es einer Multiplikation/Division mit 10 gleich. 3*10 = 30, 30*10 = 300 und so weiter.
Da das Binärsystem zur Basis zwei ist, ist Shiften mit einer Multiplikation/Division mit 2 gleichzusetzen. Intern werden die Bits allerdings tatsächlich roliert. Das aus der Zahlendarstellung herausfallende Bit kommt dabei in's Carry-Flag, so daß man Überläufe auch erkennen kann.
 
G

Guest

Gast
super danke quippy so werde ich das jetzt mal machen.
nur deinen letzten schritt verstehe ich nicht :cry:
warum verknüpfe ich meine zahl noch mal mit 0xFFFF0000 um das vorzeichen rauszukriegen?
dadurch kriege ich doch einfach eine 4 Byte Zahl, die erste 2 Bytes alles Einsen und der Rest ist meine eigentliche Zahl?
 
S

SlaterB

Gast
das passiert ja auch nur bei 0x8000, also wenn das 16. Bit eine 1 ist, was für eine negative Zahl steht,
und damit das dann auch in Java-32-bit-int eine negative Zahl ist müsssen die Einsen da rein:

Code:
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        int k = (int)Math.pow(2, 15);
        System.out.println(k + " - " + Integer.toBinaryString(k));

        if ((k & 0x8000) != 0)
        {
            k |= 0xFFFF0000;
        }
        System.out.println(k + " - " + Integer.toBinaryString(k));
    }


}
 
G

Guest

Gast
Schau dir das mal an.
Code:
FileInputStream is = new FileInputStream(file);
FileChannel channel = is.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
buffer.order(ByteOrder.LITTLE_ENDIAN);

short value = buffer.getShort();
...
 
G

Guest

Gast
achso ok danke also bei ner 32 Bit Zahl zählen die ersten 16 bits praktisch als -wert richtig? ist das nur bei 32 bit werten so?
und @ gast was ist das für ein beispiel? da versteh ich ja mal gar nix -.-
 
S

SlaterB

Gast
> zählen die ersten 16 bits praktisch als -wert richtig?

nicht immer, das wäre ja Verschwendung,

nur für eh nur die unteren 16 Bits belegt sind, dann kann sicher sein, dass die obigen immer 0 sind,
oder alle 1 wenn die Zahl negativ ist
 
G

Guest

Gast
Anonymous hat gesagt.:
achso ok danke also bei ner 32 Bit Zahl zählen die ersten 16 bits praktisch als -wert richtig? ist das nur bei 32 bit werten so?
und @ gast was ist das für ein beispiel? da versteh ich ja mal gar nix -.-
Damit kanst du die ganze Datei, unter brücksichtigung von Byte-Order, komplett auslesen, statt die Bytes "von Hand"
zu Integern zusammen zu kleistern. Java bietet mit der NIO API die nötige Funkionalität, warum diese nicht auch
verwenden.
Die Pufferung ist sauschnell. Ich kann damit z.B. 100 TIFF - Header innerhalb von 150ms auslesen und darin sämtliche
IFD-Einträge auswerten. Darauf basierend ein Index mit Offsets der Thumbnails, EXIFs und IPTC-Daten aufbauen, um
diese bei Bedarf schnell laden zu können.
 
G

Gast

Gast
häh, und wie kann ich dann eine 8 Bit lange Zahl negativ darstellen? und woher weiß java die zahl nicht einfach 32Bits lang ist anstatt der negtiven darstellung?
 
S

SlaterB

Gast
> häh, und wie kann ich dann eine 8 Bit lange Zahl negativ darstellen?

nach dem gleichen System, dann sind die ersten 24 Bits eine 1

> und woher weiß java die zahl nicht einfach 32Bits lang ist anstatt der negtiven darstellung?

was hat die negative Darstellung mit der Länge der Zahl zu tun bzw. wo siehst du da einen Konflikt?
das ist ein konsistentes System,
nur wenn man die Zahl wie in diesem Thread aus Bytes zusammenbaut ist die Negation noch nicht korrekt,
deshalb ja der Code von quippy:
> if ((resultArray & 0x8000) != 0) resultArray |= 0xFFFF0000;
 
G

Gast

Gast
hm jo danke ich probiers erstmal mit methode 1.
es klappt auch, nur komischerweise erhalte ich teilweise andere ergebnisse als mit c# -.-
denn die eingelesen bits sind teilweise unterschiedlich.
Ich lese meine Bits so ein:
import java.io.*;

public class fileReader
{
public byte[] einlesen(String datei)
{
try
{
BufferedReader reader = new BufferedReader(new FileReader(datei));
byte line;

byte[] binhalt = new byte[(int)new File(datei).length()];
int c;
int i = 0;
while ((c = reader.read()) != -1)
{
binhalt = (byte)c;
i++;
}


return binhalt;
}
catch (IOException e)
{
byte[] fehler = ("Datei nicht gefunden.").getBytes();
return (fehler);
}

}
}

binhalt wird dann mit slaters methode ins little endian format konvertiert. wo liegt der fehler?
 

semi

Top Contributor
Lese zuerst wozu der BufferedReader geeignet ist. Nimm doch einfach den MappedByteBuffer, wie im Beispiel oben gezeigt.
 
G

Gast

Gast
hm ja gut ich machs mal mit dem mappedbytebuffer
nur wollte erstmal das "manuell" probieren, die bits mit dem bufferedreader einlesen( das müsste doch gehn oder?) und dann selber shiften und so ...
 

semi

Top Contributor
Ich zitiere mal einen Ausschnitt des ersten Satzes in der API-Doku zu BufferedReader
Reads text from a character-input stream...
Merkst du was? ;) Du hast eine Binärdatei, kannst daher diesen Reader nicht verwenden.
Wenn du es von Hand machen möchtest, mach's so, wie 'SlaterB' vorgeschlagen hat. Ansonsten mit NIO,
wie in meinem Beispiel (ich war mal wieder als Dauergast nicht eingelogt) gezeigt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Datentypen 2 8bit in ein 16bit in Java Allgemeine Java-Themen 16
P PNG 32 Bit zu 16Bit konvertieren... Allgemeine Java-Themen 4
mrStudent The method append is not applicable for the arguments (Queue<Integer>, Queue<Integer>) Allgemeine Java-Themen 4
O JSON in Integer parsen Allgemeine Java-Themen 5
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
D Integer-Array variabler Größe mit Zahlen befüllen (Schleifen) Allgemeine Java-Themen 0
J Mit Lombok Integer Range prüfen Allgemeine Java-Themen 6
L Variablen Eigenes Objekt wie z.B. einen Integer zuweisen Allgemeine Java-Themen 3
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
B List<Integer> ist List<Double> ? Allgemeine Java-Themen 6
E String in Zahl umwandeln, ohne Befehl Integer.parseInt Allgemeine Java-Themen 3
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
V Eingegeben String Splitten und in Integer umwandeln Allgemeine Java-Themen 2
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
X Integer.numberOfTrailingZeros() Allgemeine Java-Themen 1
K Array, Int expected, Integer found Allgemeine Java-Themen 5
HarleyDavidson Best Practice Integer-Zahlenfolge über mehrere Programmstarts Allgemeine Java-Themen 7
B Transferable in String/Integer umwandeln Allgemeine Java-Themen 11
K Input/Output Integer.parseInt() an Textdateien anwenden Allgemeine Java-Themen 2
D Beste Collection für Integer Allgemeine Java-Themen 4
Zettelkasten Double --> Integer Allgemeine Java-Themen 4
M Datentypen ArrayList in Integer konvertieren Allgemeine Java-Themen 3
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
O Input/Output Textfeld: nur Integer annehmen Allgemeine Java-Themen 9
T int <-> integer, double <-> Double... Allgemeine Java-Themen 2
P JFormattedTextField für durch Semikolon getrennte Integer-Werte gesucht / Regulärer Ausdruck Allgemeine Java-Themen 3
GianaSisters Klassen ArrayList Index Integer int Allgemeine Java-Themen 5
G Datentypen JGoodies Binding und JSpinner mit Integer Allgemeine Java-Themen 2
L Problem mit Integer.parseInt Allgemeine Java-Themen 17
C Benchmark: ArrayList<Integer>, Integer[], int[] Allgemeine Java-Themen 10
Rudolf Aus Collection<Integer> eine Zahl machen Allgemeine Java-Themen 2
O Nach parse von String zu Integer verliere ich Programmablauf! Allgemeine Java-Themen 10
Z Cast von Long zu Integer funktionert nicht Allgemeine Java-Themen 3
E Zweidimensionales Array Integer[10 000][10 000] -> out of memory? Allgemeine Java-Themen 4
T Integer aus InputStream lesen Allgemeine Java-Themen 3
S String[] in Integer umwandeln Allgemeine Java-Themen 16
K Heap-Volllaufen bei ArrayList<Integer> Allgemeine Java-Themen 9
C Character in Integer Allgemeine Java-Themen 12
D Double to Integer - ist das möglich? Allgemeine Java-Themen 3
R Anführungszeichen Integer.valueOf(String).intValue(); Allgemeine Java-Themen 6
H Integer/String Allgemeine Java-Themen 9
MQue byte[] Array to Integer Allgemeine Java-Themen 4
J Mit mehrdimensionalen Integer-Arrays arbeiten Allgemeine Java-Themen 17
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
G erzeugen von "ArrayList<Integer>[][]" Allgemeine Java-Themen 7
M Integer.parseInt Allgemeine Java-Themen 4
G enum Integer zuweisen Allgemeine Java-Themen 14
G Integer aus String Allgemeine Java-Themen 4
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
O java.lang.NumberFormatException für normalen integer Allgemeine Java-Themen 4
T Integer hhmm addieren Allgemeine Java-Themen 11
MQue Integer in String Allgemeine Java-Themen 2
G Datumswert String in Integer umwandeln Allgemeine Java-Themen 2
P Integer und Bit-operationen Allgemeine Java-Themen 21
M Java 1.4 und Integer Allgemeine Java-Themen 3
G ArrayList<String> to ArrayList<Integer Allgemeine Java-Themen 2
S Integer zu int konvertieren - JUnit Allgemeine Java-Themen 12
J Integer Array Wert vorhanden? Allgemeine Java-Themen 6
M String nach Integer und führende Nullen Allgemeine Java-Themen 6
B Plaintext Integer einlesen und verarbeiten Allgemeine Java-Themen 3
R cast Integer[] zu int[] Allgemeine Java-Themen 2
D byte nach integer? Allgemeine Java-Themen 4
MQue Object in Integer umwandeln Allgemeine Java-Themen 3
H Integer#valueOf(int) bei 1.4 Allgemeine Java-Themen 7
M Datenstrukrue, List<Map<Integer, Map<String, . Allgemeine Java-Themen 2
M Integer in String umwandeln Allgemeine Java-Themen 7
S Object nach Integer umwandeln Allgemeine Java-Themen 13
R Integer will sich nicht lesen lassen! Allgemeine Java-Themen 9
G Umwandlung Byte in Integer Allgemeine Java-Themen 12
M reflection Integer != int ? Allgemeine Java-Themen 3
P int != Integer Allgemeine Java-Themen 3
N Prüfen ob ein String in einen Integer umgewandelt werden kan Allgemeine Java-Themen 4
P Class zu Integer, String, Double etc. Allgemeine Java-Themen 11
S Integer-Zahlen in Excel-Sheet schreiben Allgemeine Java-Themen 10
T JNI: jcharArray: warning: cast to pointer from integer of. Allgemeine Java-Themen 5
R Float richtig in Integer ? Allgemeine Java-Themen 4
T Integer und TextFelder Allgemeine Java-Themen 3
S Integer-splitten für Abfrage. Allgemeine Java-Themen 4
M Index eines Arrays ermitteln und als Integer ausgeben Allgemeine Java-Themen 7
B Integer zählen bzw. speichern Allgemeine Java-Themen 3
H Array nimmt keinen in Integer konvertierten String auf! Allgemeine Java-Themen 26
H Prüfen, ob es sich um ein Integer handelt Allgemeine Java-Themen 4
J Integer.parseInt funktioniert nicht immer Allgemeine Java-Themen 3
G Nur Integer Werte in JTextField Allgemeine Java-Themen 4
V Typumwandlung Integer, Float etc in String Allgemeine Java-Themen 4
C String in Integer wandeln Allgemeine Java-Themen 17
A ByteArray über Socket Allgemeine Java-Themen 3
G BufferedImage und ByteArray Allgemeine Java-Themen 2
P Auslesen serieller Schnittstelle - umwandeln von byteArray Allgemeine Java-Themen 3
K Sting To ByteArray und zurück Allgemeine Java-Themen 5
J CRC16 aus Bytearray in Java Allgemeine Java-Themen 6
L crc16 Über bytearray Allgemeine Java-Themen 4
T CRC (2Byte lang) Berechnng aus Bytearray Allgemeine Java-Themen 2
J Attribute eines Objekts in ByteArray Allgemeine Java-Themen 3
C ByteArray in File schreiben? Allgemeine Java-Themen 4
E boolean Array in ein byteArray mit derLänge 5 Allgemeine Java-Themen 6
D ByteArray für Image-Icon laden. Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben