[java] Java에서 Long을 byte []로 변환하고 다시 변환하는 방법

Java에서 a long를 a 로 변환하고 어떻게 byte[]다시 변환 합니까?

TCP 연결을 통해 보낼 수 있도록 a long를 로 변환하려고 합니다. 다른 쪽에서는 그것을 가져 와서 다시로 변환 하고 싶습니다 .byte[]byte[]byte[]double



답변

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();
}

또는 ByteBuffer를 반복적으로 생성하지 않도록 클래스에 래핑하십시오.

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();
    }
}

이것이 인기가 있기 때문에 대다수의 경우 구아바와 같은 라이브러리를 사용하는 것이 더 좋다고 생각합니다. 그리고 라이브러리에 대한 이상한 반대가 있다면 네이티브 Java 솔루션에 대해이 답변을 먼저 고려해야 합니다 . 내 대답은 실제로 시스템의 엔디안 자체에 대해 걱정할 필요가 없다는 것입니다.


답변

Google Guava바이트 변환 방법 을 사용할 수 있습니다 .

예:

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


답변

평범한 비트 연산에 대해 ByteBuffer 메서드를 테스트했지만 후자가 훨씬 빠릅니다.

public static byte[] longToBytes(long l) {
    byte[] result = new byte[8];
    for (int i = 7; i >= 0; i--) {
        result[i] = (byte)(l & 0xFF);
        l >>= 8;
    }
    return result;
}

public static long bytesToLong(final byte[] bytes, final int offset) {
    long result = 0;
    for (int i = offset; i < Long.BYTES + offset; i++) {
        result <<= Long.BYTES;
        result |= (bytes[i] & 0xFF);
    }
    return result;
}


답변

빠른 롤링되지 않은 버전을 찾고 있다면 길이가 8 인 “b”라는 바이트 배열을 가정하여 트릭을 수행해야합니다.

바이트 []-> 긴

long l = ((long) b[7] << 56)
       | ((long) b[6] & 0xff) << 48
       | ((long) b[5] & 0xff) << 40
       | ((long) b[4] & 0xff) << 32
       | ((long) b[3] & 0xff) << 24
       | ((long) b[2] & 0xff) << 16
       | ((long) b[1] & 0xff) << 8
       | ((long) b[0] & 0xff);

위의 정확한 대응 물인 long- > byte []

byte[] b = new byte[] {
       (byte) lng,
       (byte) (lng >> 8),
       (byte) (lng >> 16),
       (byte) (lng >> 24),
       (byte) (lng >> 32),
       (byte) (lng >> 40),
       (byte) (lng >> 48),
       (byte) (lng >> 56)};


답변

바이트 []가 왜 필요한가요? 왜 소켓에 쓰지 않습니까?

Long 대신 long 을 의미한다고 가정 하고 후자는 null 값을 허용해야합니다.

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

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


답변

기본 ByteArrayOutputStream 을 사용하여 Long을 DataOutputStream에 작성하십시오 . ByteArrayOutputStream에서 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));
        }
}

그에 따라 다른 프리미티브에 적용됩니다.

힌트 : TCP의 경우 수동으로 byte []가 필요하지 않습니다. 소켓 socket 과 그 스트림을 사용합니다

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

대신에.


답변

org.apache.hadoop.hbase.util.Bytes http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/util/Bytes.html 에서 구현을 사용할 수 있습니다 .

소스 코드는 다음과 같습니다.

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# 바이트 / 바이트 % 28long % 29

toLong 및 toBytes 메소드를 찾으십시오.

소프트웨어 라이센스를 사용하면 코드의 일부를 사용하여 사용할 수 있지만이를 확인하십시오.