binäre Daten als Double einlesen

Status
Nicht offen für weitere Antworten.

maexchen

Mitglied
Hallo!

Folgendes Problem: Hab eine Datei mit binären Daten, die als double abgespeichert sind. Beim einlesen kommen nicht die richtigen Werte.
Code:
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;

public class ccc {
    
    public static void main(String args[]) throws IOException {
        DataInputStream is = null;
        double wert;
        byte ch;    
        int i = 0;
        try {
          is = new DataInputStream(new FileInputStream("signal2-oh.bin"));
          
          while (true) { // exception deals catches EOF
                                 
            i = i+1;
            wert = is.readDouble();
            System.out.println (wert);
           
          }
              
          } catch (EOFException eof) {
          System.out.println(" >> Normal program termination.");
          System.out.println ("ZEILEN: " + i);
        }
      }
    }
 

Marco13

Top Contributor
Hm - mal wild ins Blaue geraten (!) - Es KÖNNTE sein, dass da (Suchmaschinen-Stichworte: ) Big Endian und Little Endian durcheinandergekommen sind. Eventuell(!) könnte es funktionieren, wenn du die bytes rumdrehst - ungefähr(!) so:
Code:
while (true) { // exception deals catches EOF // <- Das ist übrigens IMHO garnicht schön :-(

    long bits = 0;
    for (int i=0; i<8; i++)
    {                                 
        byte b = is.readByte();
        long shifted = ((long)b) << (i * 8L);
        bits = bits | shifted;
    }
    double wert = Double.longBitsToDouble(bits);
}
aber das ist ungetestet und - wie gesagt - nur EINE mögliche Ursache...

Evtl. kannst du dir auch mal die Bits der ERWARTETEN Zahlen und die der GELESENEN Zahlen holen
long a = Double.doubleToLongBits(expected);
long b = Double.doubleToLongBits(read);
und die beiden (bitweise ausgeben und) vergleichen.
 

maexchen

Mitglied
Hallo!

Bin nun draufgekommen, dass ich die bits vertauschen muss. Das achte ist das erste usw... Der Code funktioniert aber nicht wirklich. Hat jemand einen besseren??
 

thE_29

Top Contributor
Also das du die bits vertauschen musst kann ich mir net vorstellen..

Wenn dann ist es byte weise vertauschen!
 

maexchen

Mitglied
Das wird eingelesen, bzw steht so in meiner Datei: ½R–!ŽuÁ?
Und so soll es eingelesen werden, damit der Wert stimmt: ?ÁuŽ!–R½
Ich glaub das hier jedes bit vertauscht wird, oder?
 

thE_29

Top Contributor
Mit long gehts so

Code:
    byte data[] = null;
    long tmp = 0;
    int end = data.length - 1;
    int start = 0;
    for(int x = end; x >= start; x--)
    {
      //wenn es sich nicht um den 1. Durchlauf handelt
      if( x < end)
        tmp = tmp << 8; //dann schiebe das ganze 1en byte rüber

      tmp |= (data[x] & 255);
    }

Problem sind die nachkommazahlen...
 

cyliax

Mitglied
Ich weiß, das ist sicherlich nicht die Endlösung, aber vielleicht kannst du ja mit dem Prinzip irgendwas anfangen. Ich habs getestet, das haut auf jeden Fall hin. Ein Eingabewert 5 (00000101) wird zu 160 (10100000). Doubles kann man leider nicht so komfortabel shiften, aber wie gesagt, es geht ja ums Prinzip.

Code:
public class BitChanger {

	public static void main(String[] args) {
		int bits = 8;
		int input = 5;
		int output = 0;
		
		System.out.println("input : " + input);
		
		for (int i=bits-1; i>=0; i--)
		{
			if (input % 2 == 1)	output += Math.pow(2,i);
			input = input >> 1;
		}
		
		System.out.println("output: " + output);
	}

}

Grüße cyx

PS: Vielleicht könntest du die Zeichen die aus der Datei kommen in den entsprechenden ASCII Wert (0-255) umwandeln, dann sollte auch die Verarbeitung mit int funktionieren.
 

thE_29

Top Contributor
Bei im werden ja nicht die BITs vertauscht, sondern die BYTES!!!

Problem BigEndian LittleEndian Problem!
 

cyliax

Mitglied
jepp asche auf mein haupt, jetzt habs ichs auch begriffen, mal sehen ob ich in dieser richtung noch was tun kann.
 

Marco13

Top Contributor
Es SIND die Bytes vertauscht. Hatte aber bei meinem ersten code nicht berücksichtigt, dass man mit den Vorzeichen ein bißchen vorsichtiger sein muß. Also nochmal, mit Vorzeichenkorrektur, und als kleine praktische Test-Methode...
Code:
import java.io.*;


class DoubleTest2
{

    public static void main(String args[])
    {
        double desiredDouble = 1.234567;

        System.out.println("input   "+desiredDouble);
        long desiredLong = Double.doubleToLongBits(desiredDouble);
        System.out.println("desired "+Long.toBinaryString(desiredLong));

        byte bytes[] = new byte[8];
        for (int i=0; i<8; i++)
        {
            byte b = (byte)((desiredLong >>> (i*8)) & 0xFF);
            bytes[i] = b;
        }
        ByteArrayInputStream is = new ByteArrayInputStream(bytes);

        double value = readReverseDouble(is); // Hier den FileInputStream übergeben
        System.out.println("value   "+value);
    }


    private static double readReverseDouble(InputStream is)
    {
        try
        {
            long bits = 0;
            for (int i=0; i<8; i++)
            {
                int n = is.read();
                byte b = (byte)n;
                long lb = (long)(b<0?256+b:b); // Ggf. Vorzeichen korrigieren
                long shifted = (lb << (i * 8L));
                bits = bits | shifted;
            }
            System.out.println("read    "+Long.toBinaryString(bits));
            return Double.longBitsToDouble(bits);
        }
        catch (IOException e)
        {
            System.out.println("Oh-oh...");
        }
        return 0;
    }

}
 
G

Gast

Gast
Hallo!

Kann mir jemand die Zeile bits=bits | shifted bitte erklären, was da passiert.
Thanks.
 
S

SlaterB

Gast
zwei long werden bitweise per oder verknüpft

1100000111
|
1000100000
=
1000000000
 
G

Gast

Gast
Danke erstmal!
Ich hab so ein ähnliches Problem wie maexchen, und die Lösung von Marco13 funktioniert auch, aber mir ist nicht ganz klar wie das ganze Schritt für Schritt abläuft. Vor allem warum zum Schluss eine bitweise Oder Verknüpfung notwendig ist.
Falls sich jemand die Zeit nimmt und mir das erklären könnte, wäre ich dankbar.
 
S

SlaterB

Gast
wenn du erklären könntest, was du daran nicht verstehst, dann ginge das,
lass doch einzelne Schritte weg, dann siehst du jeweils den Unterschied,

natürlich nicht nur das Endergebnis anschauen, sondern in jedem Schleifendurchlauf nach jedem Schritt die geänderten Variablen
 
G

Gast

Gast
Verstehe die Vorzeichenkorrektur mit long lb = (long)(b<0?256+b:b); nicht.
Warum erfolgt zum Schluss eine bitweise addition?
 
S

SlaterB

Gast
hmm, du hast -5
und addierst 10 drauf,
dann hast du +5,
was kann man daran nicht verstehen?
WARUM das hier wichtig ist, gut, das ist eine andere Frage

und was meinst du mit 'Warum erfolgt zum Schluss eine bitweise addition?'
was bringt es eine vorherige Frage einfach nur zu wiederholen?

ich verzweifle und sage tschüss,
einfach nur aus einem Lehrbuch zu Grundlagen der bits und bytes alles 1:1 hinschreiben möchte ich nicht ;),
vielleicht machts ja noch wer anders
 

Pappenheimer++

Bekanntes Mitglied
jo, ich poste zumindest schonmal einen satz:
Das ODER ist keine bitweise addition (was soll das auch sein?), sondern eine bitweise maximumbildung.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
M binäre daten einlesen Java Basics - Anfänger-Themen 2
pkelod Binäre Darstellung Bitwise-Operator Java Basics - Anfänger-Themen 10
M binäre Suche im Intervall Java Basics - Anfänger-Themen 6
M binäre Suche Java Basics - Anfänger-Themen 4
amelie123456 Lineare Suche / Binäre Suche Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
RudiRüssel Binäre Suche, unsortiert, lokales Maximum Java Basics - Anfänger-Themen 15
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
S binäre semaphore Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
H Erste Schritte Binäre Suche Java Basics - Anfänger-Themen 37
A Binäre Addition Java Basics - Anfänger-Themen 15
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
L Binäre Suche Java Basics - Anfänger-Themen 2
N Array, lineare Suche, binäre Suche, Programm bleibt unerwartet stehen... Java Basics - Anfänger-Themen 6
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
J Binäre Suche eines Array Java Basics - Anfänger-Themen 5
M Methoden Binäre Suche als rekursive Variante Java Basics - Anfänger-Themen 5
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
V Binäre Suchbäume Java Basics - Anfänger-Themen 1
M Binäre Suche Fehler überall =( Java Basics - Anfänger-Themen 2
M Compiler-Fehler Binäre Zahlen in Dezimalzahlen umrechnen Java Basics - Anfänger-Themen 3
K binäre Suchbäume Java Basics - Anfänger-Themen 3
D Binäre Suche für Integerarray in rekursiver Funktion Java Basics - Anfänger-Themen 5
A Binäre Addition Java Basics - Anfänger-Themen 5
W Compiler-Fehler Binäre Suche Java Basics - Anfänger-Themen 2
S Multi-Threaded Binäre Suche Java Basics - Anfänger-Themen 29
A Binäre Suche Java Basics - Anfänger-Themen 2
W Binäre Suche Java Basics - Anfänger-Themen 8
E Binäre Bäume Java Basics - Anfänger-Themen 7
O String Binäre Suche Java Basics - Anfänger-Themen 6
M Binäre Suche, Elemente einfügen Java Basics - Anfänger-Themen 2
0x7F800000 wie pack ich komplette objekte in binäre dateien? Java Basics - Anfänger-Themen 4
A Binäre Suche; Java Basics - Anfänger-Themen 6
F Binäre Exponentiation Java Basics - Anfänger-Themen 9
G Binäre Suchbaum + Erstellung des Programmes Java Basics - Anfänger-Themen 4
R Binäre logische Operatoren Java Basics - Anfänger-Themen 21
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
Mady Daten von JList & Combobox in JTable adden Java Basics - Anfänger-Themen 2
M Daten aus errechneter Methode in Datenbank(SQLite) schreiben Java Basics - Anfänger-Themen 60
W Daten in Echtzeit übernehmen Java Basics - Anfänger-Themen 5
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
E fehlermeldung bei richtigen login daten Java Basics - Anfänger-Themen 7
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
P Schiebefix - ArrayList überschreibt Daten Java Basics - Anfänger-Themen 3
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
M Tabellen- Daten laden Java Basics - Anfänger-Themen 2
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
A Daten auslesen/vergleichen Java Basics - Anfänger-Themen 3
D Sportwetten Daten Atomatisch analysieren um optimale Strategie zu erhalten Java Basics - Anfänger-Themen 6
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
M Sqlite table löschen und daten einfügen Java Basics - Anfänger-Themen 5
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Minesweeper - Daten Java Basics - Anfänger-Themen 46
A Eingelesene Daten in Array(Liste) abspeichern? Java Basics - Anfänger-Themen 18
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
WPS1000 Input/Output Wie aktiviere ich den Daten Transfer von der RS232 in meine Java Applikation Java Basics - Anfänger-Themen 2
R Eigenes Protokoll zur Übermittlung von Daten zum Webserver? Java Basics - Anfänger-Themen 4
A Reader wohin werden Daten gespeichert? Java Basics - Anfänger-Themen 7
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
S Daten aus eigenständiger .class-Datei abrufen Java Basics - Anfänger-Themen 1
E Daten dem Super Aufruf übergeben Java Basics - Anfänger-Themen 3
M jTabel mit Daten Füllen Java Basics - Anfänger-Themen 5
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
S Daten lesen und speichern Java Basics - Anfänger-Themen 26
S JTable mit Daten füllen Java Basics - Anfänger-Themen 7
L Java Programm zum Auswerten von Daten Java Basics - Anfänger-Themen 11
H Passwortmanager, Sicherheit der Daten Java Basics - Anfänger-Themen 12
G Best Practice Wie große "Tabellen" effizient durchsuchen und Daten händeln? Java Basics - Anfänger-Themen 15
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
M Best Practice Daten-Import /Trabsfomration aus Textdatei Java Basics - Anfänger-Themen 12
R JTable Suchfunktion mit SQL Daten Java Basics - Anfänger-Themen 2
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
M Erste Schritte Speichern von mehreren Daten Java Basics - Anfänger-Themen 3
J Daten einer Textdatei in ein JTable importieren. Java Basics - Anfänger-Themen 3
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Endlosschleife bei füllen von Daten im JTable Java Basics - Anfänger-Themen 5
N Erste Schritte Dedicated Server \ Senden und Empfangen von Daten/Befehlen Java Basics - Anfänger-Themen 2
A Probleme beim zykl. aktulisieren von Daten in JTable Java Basics - Anfänger-Themen 3
D NPE beim laden von Daten aus MySQL Java Basics - Anfänger-Themen 9
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
P Methoden ausgelesene (CSV-) Daten in Liste einer anderen Klasse einlesen Java Basics - Anfänger-Themen 0
F Daten aus Excel-Tabelle in Java importieren Java Basics - Anfänger-Themen 15
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
F Daten auf Webserver laden - wiederholen bei Fehler Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben