Bitconverter für Java
Folgenden die Beratung in der Frage https://stackoverflow.com/questions/1738244/what-is-the-java-equivalent-of-net-bitconverter ich habe mit der Umsetzung begonnen meine eigenen bitconverter für Java, aber ich bin nicht immer gleichwertige Ergebnisse.
Könnte jemand bitte guide mich auf das, was ich tun könnte falsch?
public static byte[] GetBytes(Integer value) {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DataOutputStream stream = new DataOutputStream(byteStream);
try {
stream.writeInt(value);
} catch (IOException e) {
return new byte[4];
}
return byteStream.toByteArray();
}
byte[] result = BitConverter.GetBytes(1234); //JAVA: [0, 0, 4, -46]
byte[] result = BitConverter.GetBytes(1234); //C#: [210, 4, 0, 0]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist nur endianness (-46 und 210 ist, weil der Java signed Byte, aber das ist nur ein UI-Sache). Entweder die Rückseite der array-Inhalt, oder verwenden Sie shift-Operationen zu schreiben, die int.
Hinweis: die endianness, dass .NETTO emittiert, hängt von der Plattform ab. Ich würde vorschlagen, mit BEKANNTEN ENDIANNESS in beiden Fällen; die meisten wahrscheinlich durch die Verwendung von shift-Operationen von beiden. Oder vielleicht eine bessere Idee: verwenden Sie einfach eine pre-canned -, Plattform-unabhängige Serialisierungsformat (zum Beispiel: protocol buffers, die hat gute Unterstützung auf beiden Java-und .NET/C#).
Zum Beispiel, wenn ich Schreibe einen
int value
zu einembyte[] buffer
(aboffset
), die ich verwenden könnte:dadurch ist gewährleistet, little-endian -, und ähnliche-code sollte auf jedem Rahmen.
C#
BitConverter
verwenden die endianness der zugrunde liegenden achitecture. In den meisten Umgebungen wird es "little-endian" (wie in Ihrem Fall). Java istDataOutputStream
wird jedoch immer schreiben in big-endian-Format ("portable Art"). Sie müssen überprüfen Sie die endianness der Maschine und schreiben Sie entsprechend, wenn Sie wollen, um mit dem Verhalten.Auch, bytes in java sind signiert, so dass der Ausgang ist nur ein kosmetischer Unterschied. Die bit-Darstellung ist die gleiche-Sie brauchen also nicht zu befürchten, dass.
Überprüfen die endianness der Maschine, verwenden Sie die
java.nio.ByteOrder.nativeOrder()
Methode. Dann verwenden Sie diejava.nio.ByteBuffer
statt, wo Sie können geben Sie die byteorder()
und schreiben der Daten.Könnte man dann implementieren Sie Ihre Methode so:
wenn jeder Körper braucht..von C# zu JAVA BitConverter.ToInt32
Auch Int16
BitConverter.getBytes
Gebäude auf Jeff ' s Antwort, Sie können mit einem einzigen
ByteBuffer
sowohl konvertieren zu und vonint
undbyte[]
. Hier ist der code, den Sie ablegen können, in eine Klasse zu convert to/from Little Endian: