Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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??
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?
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);
}
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.
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;
}
}
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.
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