227 votes

Tableau d'entiers Java en octets

J'ai un nombre entier : 1695609641

quand j'utilise la méthode :

String hex = Integer.toHexString(1695609641);
system.out.println(hex); 

donne :

6510f329

mais je veux un tableau d'octets :

byte[] bytearray = new byte[] { (byte) 0x65, (byte)0x10, (byte)0xf3, (byte)0x29};

comment puis-je faire ça ? :D

thnx !

5 votes

0 votes

340voto

dfa Points 54490

en utilisant les NIO de Java ByteBuffer est très simple :

byte[] bytes = ByteBuffer.allocate(4).putInt(1695609641).array();

for (byte b : bytes) {
   System.out.format("0x%x ", b);
}

sortie :

0x65 0x10 0xf3 0x29

4 votes

Ou utilisez le format "0x%02X" si vous souhaitez toujours avoir deux caractères hexadécimaux ainsi que des caractères hexadécimaux en majuscules, par exemple System.out.format("0x%02X", (byte) 10) affiche 0x0A .

0 votes

ByteBuffer.allocate() ne semble pas exister mais allocateDirect() existe. C'est ce que je vais faire.

1 votes

La Javadoc de @conor indique que allocateDirect() a un coût et doit être utilisée lorsqu'un tampon est conservé pendant un certain temps. Bien que la réponse fonctionne, elle semble un peu exagérée pour le cas d'utilisation en question.

178voto

Grzegorz Oledzki Points 10491

Pourquoi pas :

public static final byte[] intToByteArray(int value) {
    return new byte[] {
            (byte)(value >>> 24),
            (byte)(value >>> 16),
            (byte)(value >>> 8),
            (byte)value};
}

L'idée est pas le mien . Je l'ai pris de quelques articles sur dzone.com .

2 votes

-Ce n'est pas une bonne idée de coder manuellement ce genre de choses ; c'est à cela que servent les bibliothèques JDK correctement testées et révisées.

52 votes

Je comprends votre point de vue, mais pour cette tâche particulière, "mon" code est plus déclaratif et clair qu'un ByteBuffer "magique", qu'il faut vérifier pour voir ce qu'il fait.

27 votes

Il y a beaucoup de cas où ce type de code est approprié, par exemple dans le traitement des images. Les bibliothèques du JDK sont excellentes en général, mais elles ne couvrent pas et/ou ne sont pas optimisées pour tous les cas d'utilisation.

52voto

vmpn Points 177

BigInteger.valueOf(1695609641).toByteArray()

4 votes

Quelle garantie avez-vous que cela produira un tableau de 4 octets ?

2 votes

Exactement ce que MeBigFatGuy a écrit. Javadoc de BigInteger.toByteArray() déclare : "Le tableau contiendra le nombre minimum d'octets nécessaires pour représenter ce BigInteger..."

2 votes

Où dans la question est-il demandé que le tableau d'octets soit de longueur fixe 4 ? Selon l'algorithme auquel il est destiné, vous pouvez utiliser la longueur du tableau.

7voto

Carl Smotricz Points 36400
byte[] conv = new byte[4];
conv[3] = (byte) input & 0xff;
input >>= 8;
conv[2] = (byte) input & 0xff;
input >>= 8;
conv[1] = (byte) input & 0xff;
input >>= 8;
conv[0] = (byte) input;

2 votes

Cela extrait les 8 octets les moins significatifs. Cela évite également de faire glisser le signe du nombre d'entrée dans l'octet converti.

0 votes

stackoverflow.com/questions/35305634/ - pouvez-vous s'il vous plaît résoudre ce C# en Java ?

2voto

HaoQi Li Points 2200

Les morceaux ci-dessous fonctionnent au moins pour envoyer un int sur UDP.

int en tableau d'octets :

public byte[] intToBytes(int my_int) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = new ObjectOutputStream(bos);
    out.writeInt(my_int);
    out.close();
    byte[] int_bytes = bos.toByteArray();
    bos.close();
    return int_bytes;
}

tableau d'octets en int :

public int bytesToInt(byte[] int_bytes) throws IOException {
    ByteArrayInputStream bis = new ByteArrayInputStream(int_bytes);
    ObjectInputStream ois = new ObjectInputStream(bis);
    int my_int = ois.readInt();
    ois.close();
    return my_int;
}

6 votes

L'utilisation de ObjectOutputStream est incorrecte. Utilisez DataOutputStream, l'utilisation de OOS fait que le tableau d'octets n'est pas de 4 octets.

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