Bitkonverter für Java

8

Befolgen Sie die Hinweise in der Frage Ссылка habe begonnen, meinen eigenen Bitconverter für Java zu implementieren, bekomme aber keine gleichwertigen Ergebnisse.

Könnte mir bitte jemand sagen, was ich falsch mache?

%Vor%     
Maxim Gershkovich 03.05.2011, 06:10
quelle

4 Antworten

8

Das ist nur Endianness (-46 und 210 ist wegen der signierten Bytes von Java, aber das ist nur eine UI-Sache). Sie können entweder den Array-Inhalt umkehren oder Shift-Operationen verwenden, um den Int.

zu schreiben

Hinweis: Die Endianz, die .NET aussendet, hängt von der Plattform ab. Ich würde vorschlagen, in beiden Fällen KNOWN ENDIANNESS zu verwenden; am wahrscheinlichsten, indem Sie Schichtoperationen von beiden verwenden. Oder vielleicht eine bessere Idee: Verwenden Sie einfach ein vordefiniertes, plattformunabhängiges Serialisierungsformat (zum Beispiel: Protokollpuffer, die sowohl Java als auch .NET / C # gut unterstützen).

Zum Beispiel; wenn ich ein int value in ein byte[] buffer schreiben würde (beginnend bei offset ), könnte ich folgendes verwenden:

%Vor%

Dies ist garantiert Little-Endian, und ähnlicher Code sollte auf jedem Framework funktionieren.

    
Marc Gravell 03.05.2011, 06:16
quelle
4

Die C # BitConverter wird die Endianess der zugrunde liegenden Architektur verwenden. In den meisten Umgebungen wird es Little-Endian sein (wie in Ihrem Fall). Javas DataOutputStream schreibt jedoch immer in Big-Endian ("der portable Weg"). Sie müssen die Endianz der Maschine überprüfen und entsprechend schreiben, wenn Sie das Verhalten anpassen möchten.

Auch Bytes in Java sind signiert, so dass die Ausgabe nur ein kosmetischer Unterschied ist. Die Bitdarstellung ist die gleiche, so dass Sie sich darüber keine Gedanken machen müssen.

Verwenden Sie die java.nio.ByteOrder.nativeOrder() Methode. Dann verwenden Sie stattdessen die java.nio.ByteBuffer , wo Sie das Byte order() und schreiben die Daten.

Sie könnten Ihre Methode dann folgendermaßen implementieren:

%Vor%     
Jeff Mercado 03.05.2011 06:27
quelle
1

Aufbauend auf Jeffs Antwort können Sie ein einzelnes ByteBuffer verwenden, um sowohl nach int als auch nach byte[] zu konvertieren. Hier ist Code, den Sie in eine Klasse einfügen können, um sie zu / von Little Endian zu konvertieren:

%Vor%     
Matt Klein 21.11.2014 23:54
quelle
1

wenn irgendein Körper ... C # zu JAVA BitConverter.ToInt32

braucht %Vor%

Auch Int16

%Vor%

BitConverter.getBytes

%Vor%     
Jevgenij Kononov 28.06.2016 13:56
quelle

Tags und Links