169 votes

Convertir un tableau d'octets en entier en java et vice versa

Je veux stocker des données dans bytearrays en java. Bref des chiffres qui peut prendre jusqu'à 2 Octets par numéro.

Je voudrais savoir comment je peux convertir un entier sur 2 octets bytearray et vice versa. J'ai trouvé beaucoup de solutions googeling mais la plupart d'entre eux de ne pas expliquer ce qui se passe dans le code. Il y a beaucoup de changement de trucs que je ne comprends pas vraiment, donc je vous serais reconnaissant une explication de base.

merci d'avance

261voto

Jeff Mercado Points 42075

Utiliser les classes trouvées dans l' java.nio d'espace de noms, en particulier, l' ByteBuffer. Il peut faire tout le travail pour vous.

byte[] arr = { 0x00, 0x01 };
ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default
short num = wrapped.getShort(); // 1

ByteBuffer dbuf = ByteBuffer.allocate(2);
dbuf.putShort(num);
byte[] bytes = dbuf.array(); // { 0, 1 }

156voto

Jarek Przygódzki Points 1215
byte[] toByteArray(int value) {
     return  ByteBuffer.allocate(4).putInt(value).array();
}

byte[] toByteArray(int value) {
    return new byte[] {
        (byte) (value >> 24),
        (byte) (value >> 16),
        (byte) (value >> 8),
        (byte) value};
}

int fromByteArray(byte[] bytes) {
     return ByteBuffer.wrap(bytes).getInt();
}

int fromByteArray(byte[] bytes) {
     return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF)
}

72voto

Jamel Toms Points 944

Vous pouvez également utiliser BigInteger pour la variable d'octets de longueur. Vous pouvez le convertir en Long, Entier ou Court, selon ce qui convient à vos besoins.

new BigInteger(bytes).intValue();

ou pour désigner la polarité:

new BigInteger(1, bytes).intValue();

Pour obtenir des octets en arrière:

new BigInteger(bytes).toByteArray()

6voto

prekageo Points 178

Une base de mise en œuvre serait quelque chose comme ceci:

public class Test {
    public static void main(String[] args) {
        int[] input = new int[] { 0x1234, 0x5678, 0x9abc };
        byte[] output = new byte[input.length * 2];

        for (int i = 0, j = 0; i < input.length; i++, j+=2) {
            output[j] = (byte)(input[i] & 0xff);
            output[j+1] = (byte)((input[i] >> 8) & 0xff);
        }

        for (int i = 0; i < output.length; i++)
            System.out.format("%02x\n",output[i]);
    }
}

Afin de comprendre les choses, vous pouvez lire cet WP article: http://en.wikipedia.org/wiki/Endianness

Ci-dessus le code source sera de sortie 34 12 78 56 bc 9a. Les 2 premiers octets (34 12) représentent le premier entier, etc. Ci-dessus le code source code des entiers en little endian format.

-7voto

je pense que c'est un meilleur mode de cast en int

   public int ByteToint(Byte B){
        String comb;
        int out=0;
        comb=B+"";
        salida= Integer.parseInt(comb);
        out=out+128;
        return out;
    }

première comvert octet String

comb=B+"";

la prochaine étape est comvert pour un int

out= Integer.parseInt(comb);

mais octet est dans la rage de -128 à 127 pour cette reasone, je pense que c'est mieux d'utiliser la rage de 0 à 255 et vous avez seulement besoin de le faire:

out=out+128;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X