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.
Réponses
Trop de publicités? 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();
}
}
Vous pouvez utiliser les méthodes de conversion Byte de Google Guava .
Exemple:
byte[] bytes = Longs.toByteArray(12345L);
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();
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:
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.
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.