Bitconverter pour Java
Suivant les conseils fournis dans la question https://stackoverflow.com/questions/1738244/what-is-the-java-equivalent-of-net-bitconverter j'ai commencé à réaliser mes propres bitconverter pour Java mais je ne suis pas d'obtenir des résultats équivalents.
Quelqu'un pourrait-il svp me guider sur ce que je fais mal?
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]
OriginalL'auteur Maxim Gershkovich | 2011-05-03
Vous devez vous connecter pour publier un commentaire.
Qui est juste endianness (-46 et 210 est à cause de Java est signé octets, mais c'est juste une INTERFACE chose). Soit de renverser le contenu du tableau, ou de l'utilisation des opérations de déplacement d'écrire int.
Remarque: le boutisme .NET émet dépend de la plate-forme. Je conseille CONNU BOUTISME dans les deux cas; la plupart du temps en utilisant des opérations de déplacement de deux. Ou peut-être une meilleure idée: il suffit d'utiliser un pré-arrangé, indépendant de la plateforme format de sérialisation (par exemple: protocole de tampons, qui a un bon soutien sur Java et en .NET/C#).
Par exemple; si j'écrivais un
int value
à unbyte[] buffer
(à partir deoffset
), je pourrais utiliser:c'est garanti little-endian, et le même code devrait fonctionner sur n'importe quel cadre.
cependant, la mesure dans les données que vous avez lu jusqu'à présent
OriginalL'auteur Marc Gravell
Le C#
BitConverter
utilisera le boutisme de la sous-achitecture. Dans la plupart des environnements, il est little-endian (comme il est dans votre cas). Java estDataOutputStream
cependant toujours écrire en big-endian ("les mobiles"). Vous aurez besoin de vérifier le boutisme de la machine et de l'écriture en conséquence si vous voulez faire correspondre le comportement.Aussi, les octets en java sont signés de sorte que le résultat est juste une esthétique de la différence. La représentation binaire est le même si vous n'avez pas besoin de s'inquiéter à ce sujet.
Pour vérifier le stockage de votre machine, utilisez le
java.nio.ByteOrder.nativeOrder()
méthode. Ensuite, utilisez lajava.nio.ByteBuffer
au lieu où vous pouvez spécifier l'octet()
et écrire les données.Vous pouvez ensuite appliquer votre méthode comme ceci:
OriginalL'auteur Jeff Mercado
si tout besoin de corps..C# JAVA BitConverter.ToInt32
Aussi Int16
BitConverter.getBytes
OriginalL'auteur Jevgenij Kononov
Bâtiment sur Jeff de réponse, vous pouvez utiliser un seul
ByteBuffer
à convertir à la fois vers et à partir deint
etbyte[]
. Voici le code vous pouvez vous déplacer dans une classe de convertir vers/à partir de Little Endian:OriginalL'auteur Matt Klein