10
votes

Bitconverter pour Java

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]


0 commentaires

4 Réponses :


11
votes

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);


1 commentaires

Quelle est la valeur compensée?



4
votes

Le c # bitconverter utilisera l'endansion de l'achitecture sous-jacente. Dans la plupart des environnements, ce sera petit-Endian (comme dans votre cas). Java's DataOutPutStream 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.

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.

Pour vérifier l'endansion de votre machine, utilisez le java.nio.byteorder.ca -nerordorder () méthode. Ensuite, utilisez le java.nio.bytebuffer à la place où vous pouvez spécifier l'octet ordre () et écrivez les données.

Vous pouvez ensuite implémenter votre méthode comme celle-ci: < Pré> xxx


0 commentaires

1
votes

Bâtiment sur la réponse de Jeff, vous pouvez utiliser un seul bytebuffer pour convertir les deux vers et depuis int et octet [] . Voici le code que vous pouvez déposer dans une classe à convertir / à partir de la petite Endian: xxx


0 commentaires

4
votes

Si n'importe quel corps besoin..c # à java bitconverter.toint32 xxx

aussi int16 xxx

bitconverter.getbytes xxx


0 commentaires