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 einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Java Byte Array to Float
- Ersteller Squicky
- Erstellt am
yoT!mO
Commander
- Registriert
- März 2007
- Beiträge
- 2.700
nimm ba[0], steck es in eine float-Variable, schieb es dort um 3*8 nach links
nimm ba[1], steck es in die selbe Variable, schieb es dort um 2*8 nach links.
usw.
Edit: Ok, ganz eindeutig war das jetzt nicht. So müsste es besser gehen:
müsste so stimmen.
Gruß Timo
nimm ba[1], steck es in die selbe Variable, schieb es dort um 2*8 nach links.
usw.
Edit: Ok, ganz eindeutig war das jetzt nicht. So müsste es besser gehen:
Code:
float f = 0;
for (int i = 0; i < 3; i++) {
f = f | ba[i];
f = f << 8;
}
f = f | ba[3]
müsste so stimmen.
Gruß Timo
Zuletzt bearbeitet:
- Registriert
- Sep. 2002
- Beiträge
- 1.422
schon getestet:
-->
Code:
float f = 0;
float a = 0;
for (int i = 0; i < 4; i++) {
a = ba[i];
f = f | a;
f = f << 8;
}
-->
Code:
error: bad operand types for binary operator '|'
f = f | a;
first type: float
second type: float
W
Whiz-zarD
Gast
Das liegt daran, dass float eine Fließkommazahl ist. Die werden anders abgebildet, als ganzzahlige Typen.
Bitoperatoren kann man nur bei ganzzahligen Typen verwenden.
Wie wird denn überhaupt die Fließkommazahl in ein Array zerlegt?
Bitoperatoren kann man nur bei ganzzahligen Typen verwenden.
Wie wird denn überhaupt die Fließkommazahl in ein Array zerlegt?
W
Whiz-zarD
Gast
Es ist in keiner mir bekannter Sprache möglich, Bitoperatoren auf Fließkommazahlen durchzuführen.
Sowas ist einfach nicht vorgesehen.
Wie gesagt, Fließkommazahlen werden anders abgebildet.
Eine Fließkommazahl besteht aus einem Vorzeichen-Bit, einigen Mantissen-Bits und einigen Exponenten-Bits.
http://de.wikipedia.org/wiki/IEEE_754
Sowas ist einfach nicht vorgesehen.
Wie gesagt, Fließkommazahlen werden anders abgebildet.
Eine Fließkommazahl besteht aus einem Vorzeichen-Bit, einigen Mantissen-Bits und einigen Exponenten-Bits.
http://de.wikipedia.org/wiki/IEEE_754
ice-breaker
Commodore
- Registriert
- Nov. 2008
- Beiträge
- 4.132
Du kannst die Bytes erst in einen Integer umwandeln (um somit eine 32Bit Bitkette zu haben) und dann mit Float.intBitsToFloat() in eine Float-Zahl "umwandeln".
Dabei wird die Zahl nicht in echt umgewandelt sondern einfach die Bit-Kette in den Float-Speicherplatz kopiert.
Es ist also eigentlich mehr eine Funktion um eine Float-Zahl anhand einer Bit-Kette aufzubauen.
Dabei wird die Zahl nicht in echt umgewandelt sondern einfach die Bit-Kette in den Float-Speicherplatz kopiert.
Es ist also eigentlich mehr eine Funktion um eine Float-Zahl anhand einer Bit-Kette aufzubauen.
antred
Lt. Commander
- Registriert
- Juni 2010
- Beiträge
- 1.288
Whiz-zarD schrieb:Es ist in keiner mir bekannter Sprache möglich, Bitoperatoren auf Fließkommazahlen durchzuführen.
Na ja, zumindest nicht ohne dreckige Tricksereien.
yoT!mO
Commander
- Registriert
- März 2007
- Beiträge
- 2.700
Ja, ich weiß, wie Fließkommazahlen im Rechner dargestellt werden.
Aber im Grunde ist auch ein float nichts anderes als eine Folge von 32 Bits. Und ich versteh nicht, wieso man auf diese Bits keine Operationen anwenden darf/soll. O_o
Wie die Bits nachher interpretiert werden sollen, kann doch der Bit-Operation egal sein, oder?
Gruß Timo
Aber im Grunde ist auch ein float nichts anderes als eine Folge von 32 Bits. Und ich versteh nicht, wieso man auf diese Bits keine Operationen anwenden darf/soll. O_o
Wie die Bits nachher interpretiert werden sollen, kann doch der Bit-Operation egal sein, oder?
Gruß Timo
Killkrog
Lt. Junior Grade
- Registriert
- Jan. 2006
- Beiträge
- 356
Das ist eigentlich ziemlich einfach zu lösen...
Code:
public static void main(String[] args) throws Throwable {
// Folgende Bytes ergeben aneinander gereiht die Zahl 13.37 nach IEEE-754
byte[] bytesReceived = new byte[4];
bytesReceived[0] = (byte) 0x00000041;
bytesReceived[1] = (byte) 0x00000055;
bytesReceived[2] = (byte) 0x000000eb;
bytesReceived[3] = (byte) 0x00000085;
final int BYTE_BIT_MASK = 0x000000ff;
int rawInteger = 0;
for (byte receivedByte : bytesReceived) {
rawInteger <<= 8;
rawInteger |= (receivedByte & BYTE_BIT_MASK);
}
System.out.println(Float.intBitsToFloat(rawInteger)); // => Müsste wieder 13.37 ergeben
}
Zuletzt bearbeitet:
Code:
public static void main(String[] args) {
byte[] bytesReceived = new byte[4];
bytesReceived[0] = (byte) 0x00000041;
bytesReceived[1] = (byte) 0x00000055;
bytesReceived[2] = (byte) 0x000000eb;
bytesReceived[3] = (byte) 0x00000085;
ByteBuffer b = ByteBuffer.wrap(bytesReceived);
System.out.println(b.getFloat());
}
Ähnliche Themen
- Antworten
- 18
- Aufrufe
- 2.057
- Antworten
- 0
- Aufrufe
- 1.341
- Antworten
- 2
- Aufrufe
- 976