Suivre le conseil fourni dans la question https: // Stackoverflow. com / questions / 1738244 / what-is-the-java-équivalent-of-net-bitconverter J'ai commencé à mettre en œuvre mon propre bitconverter pour Java, mais je ne reçois pas de résultats équivalents.
Quelqu'un pourrait-il me guider sur Ce que je pourrais faire de manière incorrecte? p>
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]
4 Réponses :
C'est juste l'endianness (-46 et 210 est à cause des octets signés de Java, mais c'est juste une chose d'assurance-emploi). Soit inverser le contenu de la matrice ou utilisez les opérations de décalage pour écrire l'int.
Remarque: l'endansion que .NET Emet dépend de la plate-forme. Je suggérerais d'utiliser une endansion connue dans les deux cas; probablement en utilisant des opérations de changement de fois. Ou peut-être une meilleure idée: utilisez simplement un format de sérialisation indépendant de la plate-forme pré-conserve (par exemple: des tampons de protocole, qui a un bon support sur Java et .NET / C #). P>
Par exemple; Si j'écris un int Valest code> à un
byte [] tampon code> (à partir de
Décalage code>), je pourrais utiliser: p>
buffer[offset++] = (byte)value;
buffer[offset++] = (byte)(value>>8);
buffer[offset++] = (byte)(value>>16);
buffer[offset++] = (byte)(value>>24);
Quelle est la valeur compensée?
Le c # En outre, les octets en Java sont signés afin que la sortie est juste une différence esthétique. La représentation du bit est la même chose, vous n'avez donc pas besoin de vous inquiéter de cela. P> Pour vérifier l'endansion de votre machine, utilisez le Vous pouvez ensuite implémenter votre méthode comme celle-ci: p> < Pré> xxx pré> p> bitconverter code> utilisera l'endansion de l'achitecture sous-jacente. Dans la plupart des environnements, ce sera petit-Endian (comme dans votre cas). Java's
DataOutPutStream code> Cependant, écrira toujours dans Big-Endian ("The Portable Way"). Vous aurez besoin de vérifier l'endansion de la machine et d'écrire en conséquence si vous souhaitez correspondre au comportement.
java.nio.byteorder.ca -nerordorder () code>
méthode. Ensuite, utilisez le java.nio.bytebuffer Code>
à la place où vous pouvez spécifier l'octet ordre () code>
et écrivez les données. P>
Bâtiment sur la réponse de Jeff, vous pouvez utiliser un seul bytebuffer code> pour convertir les deux vers et depuis
int code> et
octet [] code>. Voici le code que vous pouvez déposer dans une classe à convertir / à partir de la petite Endian:
Si n'importe quel corps besoin..c # à java bitconverter.toint32 aussi int16 p> bitconverter.getbytes p>