216 votes

Comment convertir une longueur en octet [] et une version retour en java

Comment convertir un long en octet [] et revenir en Java? J'essaye de convertir un long octet en octet [] afin de pouvoir envoyer l'octet [] via une connexion TCP. De l'autre côté, je veux prendre cet octet [] et le reconvertir en double. Des conseils seraient appréciés.

293voto

Brad Mace Points 12173
 public byte[] longToBytes(long x) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    buffer.putLong(x);
    return buffer.array();
}

public long bytesToLong(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    buffer.put(bytes);
    buffer.flip();//need flip 
    return buffer.getLong();
}
 

Ou enveloppé dans une classe pour éviter de créer à plusieurs reprises ByteBuffers:

 public class ByteUtils {
    private static ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);    

    public static byte[] longToBytes(long x) {
        buffer.putLong(0, x);
        return buffer.array();
    }

    public static long bytesToLong(byte[] bytes) {
        buffer.put(bytes, 0, bytes.length);
        buffer.flip();//need flip 
        return buffer.getLong();
    }
}
 

113voto

Sonson123 Points 1464

Vous pouvez utiliser les méthodes de conversion Byte de Google Guava .

Exemple:

 byte[] bytes = Longs.toByteArray(12345L);
 

16voto

Peter Lawrey Points 229686

Pourquoi avez-vous besoin de l'octet []? pourquoi ne pas simplement l'écrire dans la prise?

Je suppose que vous voulez dire long plutôt que long , ce dernier doit prendre en compte les valeurs nulles.

 DataOutputStream dos = new DataOutputStream(
     new BufferedOutputStream(socket.getOutputStream()));
dos.writeLong(longValue);

DataInputStream dis = new DataInputStream(
     new BufferedInputStream(socket.getInputStream()));
long longValue = dis.readLong();
 

5voto

Marquez Points 1980

Vous pouvez utiliser la mise en œuvre dans org.apache.hadoop.hbase.util.Octets http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html

Le code source est ici:

http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/com.cloudera.hbase/hbase/0.89.20100924-28/org/apache/hadoop/hbase/util/Bytes.java#Bytes.toBytes%28long%29

Recherchez les toLong et toBytes méthodes.

Je crois que la licence du logiciel vous permet de prendre des parties du code et de l'utiliser mais s'il vous plaît vérifier que.

4voto

Michael Konietzka Points 3007

Il suffit d'écrire le long d'un DataOutputStream avec un sous-jacent ByteArrayOutputStream. À partir de la ByteArrayOutputStream vous pouvez obtenir le tableau d'octets via toByteArray():

class Main
{

        public static byte[] long2byte(long l) throws IOException
        {
        ByteArrayOutputStream baos=new ByteArrayOutputStream(Long.SIZE/8);
        DataOutputStream dos=new DataOutputStream(baos);
        dos.writeLong(l);
        byte[] result=baos.toByteArray();
        dos.close();    
        return result;
        }


        public static long byte2long(byte[] b) throws IOException
        {
        ByteArrayInputStream baos=new ByteArrayInputStream(b);
        DataInputStream dos=new DataInputStream(baos);
        long result=dos.readLong();
        dos.close();
        return result;
        }


        public static void main (String[] args) throws java.lang.Exception
        {

         long l=123456L;
         byte[] b=long2byte(l);
         System.out.println(l+": "+byte2long(b));       
        }
}

Fonctionne pour d'autres primitives en conséquence.

Conseil: Pour TCP vous n'avez pas besoin de le byte[] manuellement. Vous allez utiliser un Socket socket et de ses flux de

OutputStream os=socket.getOutputStream(); 
DataOutputStream dos=new DataOutputStream(os);
dos.writeLong(l);
//etc ..

au lieu de cela.

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