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%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 schreibenHinweis: 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:
Dies ist garantiert Little-Endian, und ähnlicher Code sollte auf jedem Framework funktionieren.
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% 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:
wenn irgendein Körper ... C # zu JAVA BitConverter.ToInt32
braucht %Vor%Auch Int16
%Vor%BitConverter.getBytes
%Vor%