2010-02-02 7 views
148

I a obtenu un nombre entier: 1695609641Java entier à tableau d'octets

lorsque 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 cela?

+4

double possible [Convertir entier en tableau d'octets (Java)] (http://stackoverflow.com/questions/1936857/convert-integer-into-byte-array-java) – finnw

Répondre

248

utilise Java NIO ByteBuffer de 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 
+3

Ou utilisez le format '" 0x% 02X "' si vous voulez toujours deux caractères hexadécimaux ainsi que des hexadécimales majuscules, par exemple. 'System.out.format (" 0x% 02X ", (octet) 10)' affiche '0x0A'. –

+0

ByteBuffer.allocate() ne semble pas exister mais allocateDirect() le fait. Je vais avec ça. – conor

+0

@conor Javadoc indique que allocateDirect() a un coût et devrait être utilisé lorsqu'un tampon est conservé pendant un certain temps. Bien que la réponse fonctionne, il semble être un peu exagéré pour le cas d'utilisation à portée de main. –

0
integer & 0xFF 

pour le premier octet

(integer >> 8) & 0xFF 

pour la deuxième et la boucle etc., l'écriture dans un tableau d'octets préaffectées. Un peu brouillon, malheureusement.

123

Que diriez-vous:

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 à moi. Je l'ai pris de some post on dzone.com.

+2

-1 Pas une bonne idée de coder manuellement les choses comme ça; C'est ce que les bibliothèques JDK correctement testées et révisées sont pour. –

+40

Je vois ce que vous voulez dire, mais pour cette tâche particulière, mon code est plus déclaratif et plus clair qu'un ByteBuffer «magique», que l'on doit vérifier pour voir ce qu'il fait. –

+22

@Kevin - c'est très dur - il y a beaucoup de cas où ce genre de code est approprié, par ex. dans le traitement d'image. Les librairies JDK sont géniales en général, mais elles ne couvrent pas et/ou ne sont pas optimisées pour tous les cas d'utilisation. – mikera

5
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; 
+0

Je me demande, quel est le point de '& 0xFF'? –

+0

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

+0

http://stackoverflow.com/questions/35305634/how-to-write-this-c-sharp-four-bytes-of-length-info-in-java - pouvez-vous résoudre ce C# en Java? – YumYumYum

38

BigInteger.valueOf(1695609641).toByteArray()

+2

quelle garantie avez-vous que cela produira un 4 octets de tableau? – MeBigFatGuy

+1

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

+2

Où dans la question demande-t-il que le tableau d'octets soit de longueur fixe 4? Selon l'algorithme, cela fait partie de vous pouvez utiliser la longueur du tableau – vmpn

1

Les org.apache.hadoop.hbase.util.Bytes de classe a un tas de méthodes de conversion utiles byte [], mais vous ne voudrez peut-être pas ajouter l'ensemble HBase jar t o votre projet juste à cet effet. Il est surprenant que non seulement une telle méthode manque AFAIK du JDK, mais aussi des bibliothèques évidentes comme io commons.

4

Les blocs ci-dessous fonctionnent au moins pour envoyer un int via UDP.

int 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

octets à 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; 
} 
+4

l'utilisation de ObjectOutputStream est incorrecte. Utilisez DataOutputStream, l'utilisation de OOS le rend si le tableau d'octets n'est pas 4 octets. – MeBigFatGuy

4
public static byte[] intToBytes(int x) throws IOException { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    DataOutputStream out = new DataOutputStream(bos); 
    out.writeInt(x); 
    out.close(); 
    byte[] int_bytes = bos.toByteArray(); 
    bos.close(); 
    return int_bytes; 
} 
1

Mon essai:

public static byte[] toBytes(final int intVal, final int... intArray) { 
    if (intArray == null || (intArray.length == 0)) { 
     return ByteBuffer.allocate(4).putInt(intVal).array(); 
    } else { 
     final ByteBuffer bb = ByteBuffer.allocate(4 + (intArray.length * 4)).putInt(intVal); 
     for (final int val : intArray) { 
      bb.putInt(val); 
     } 
     return bb.array(); 
    } 
} 

Avec elle, vous pouvez le faire:

byte[] fourBytes = toBytes(0x01020304); 
byte[] eightBytes = toBytes(0x01020304, 0x05060708); 

classe complète est ici: https://gist.github.com/superbob/6548493, il prend en charge l'initialisation du short ou longue

byte[] eightBytesAgain = toBytes(0x0102030405060708L); 
18
byte[] IntToByteArray(int data) { 

byte[] result = new byte[4]; 

result[0] = (byte) ((data & 0xFF000000) >> 24); 
result[1] = (byte) ((data & 0x00FF0000) >> 16); 
result[2] = (byte) ((data & 0x0000FF00) >> 8); 
result[3] = (byte) ((data & 0x000000FF) >> 0); 

return result; 
} 
16

En utilisant Guava:

byte[] bytearray = Ints.toByteArray(1695609641);