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 솔루션에 대해이 답변을 먼저 고려해야 합니다 . 내 대답은 실제로 시스템의 엔디안 자체에 대해 걱정할 필요가 없다는 것입니다.
답변
답변
평범한 비트 연산에 대해 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 에서 구현을 사용할 수 있습니다 .
소스 코드는 다음과 같습니다.
toLong 및 toBytes 메소드를 찾으십시오.
소프트웨어 라이센스를 사용하면 코드의 일부를 사용하여 사용할 수 있지만이를 확인하십시오.