How to convert byte array to double and vice versa?

To convert a byte array to double, I found this:

//convert 8 byte array to double int start=0;//??? int i = 0; int len = 8; int cnt = 0; byte[] tmp = new byte[len]; for (i = start; i < (start + len); i++) { tmp[cnt] = arr[i]; //System.out.println(java.lang.Byte.toString(arr[i]) + " " + i); cnt++; } long accum = 0; i = 0; for ( int shiftBy = 0; shiftBy < 64; shiftBy += 8 ) { accum |= ( (long)( tmp[i] & 0xff ) ) << shiftBy; i++; } return Double.longBitsToDouble(accum); 

But I could not find anything to convert double to an array of bytes.

+34
java double bytearray
May 25 '10 at 14:25
source share
6 answers

Or even easier

 import java.nio.ByteBuffer; public static byte[] toByteArray(double value) { byte[] bytes = new byte[8]; ByteBuffer.wrap(bytes).putDouble(value); return bytes; } public static double toDouble(byte[] bytes) { return ByteBuffer.wrap(bytes).getDouble(); } 
+85
Nov 10 2018-11-11T00:
source share
 long bits = Double.doubleToLongBits(myDouble); 
+13
May 25, '10 at 14:29
source share
 public static byte[] toByteArray(double d) { long l = Double.doubleToRawLongBits(d); return new byte[] { (byte)((l >> 56) & 0xff), (byte)((l >> 48) & 0xff), (byte)((l >> 40) & 0xff), (byte)((l >> 32) & 0xff), (byte)((l >> 24) & 0xff), (byte)((l >> 16) & 0xff), (byte)((l >> 8) & 0xff), (byte)((l >> 0) & 0xff), }; } 
+11
May 25 '10 at 14:43
source share

Functionality is already implemented in the API. Wrap the byte array in ByteBuffer and use ByteBuffer.putLong and ByteBuffer.getLong :

 import java.nio.*; import java.util.Arrays; public class Test { public static void main(String... args) throws Exception { long[] longArray = { 1234, 2345, 3456 }; // Longs to bytes byte[] bytes = new byte[longArray.length * 8]; ByteBuffer buf = ByteBuffer.wrap(bytes); for (long l : longArray) buf.putLong(l); System.out.println(Arrays.toString(bytes)); // Bytes to longs ByteBuffer buf2 = ByteBuffer.wrap(bytes); long[] longs = new long[bytes.length / 8]; for (int i = 0; i < longs.length; i++) longs[i] = buf2.getLong(i*8); System.out.println(Arrays.toString(longs)); } } 

Output:

 [0, 0, 0, 0, 0, 0, 4, -46, 0, 0, 0, 0, 0, 0, 9, 41, 0, 0, 0, 0, 0, 0, 13, -128] [1234, 2345, 3456] 
+8
May 25 '10 at 14:49
source share
 public static final short byteArrayToShort(byte[] bytes) { return ByteBuffer.wrap(bytes).getShort(); } public static final int byteArrayToInt(byte[] bytes) { return ByteBuffer.wrap(bytes).getInt(); } public static final float byteArrayToFloat(byte[] bytes) { return ByteBuffer.wrap(bytes).getFloat(); } public static double byteArrayToDouble(byte[] bytes) { return ByteBuffer.wrap(bytes).getDouble(); } public static final long byteArrayToLong(byte[] bytes) { return ByteBuffer.wrap(bytes).getLong(); } 

Go and enjoy.

+3
06 Sep '16 at 10:49 on
source share

In fact, I ran into problems with the top and bottom of the double, this seems to be the only code I saw that fixes this. Hope this helps others find answers in this area. if you switch to some other code, make sure that you check the full range of values, you should write a loop that converts to and from all values ​​and confidently approve them.

 // byte2Double method - extracts doubles from byte array // source: http://www.java2s.com/Code/Java/Data-Type/bytetoDouble.htm public static final double[] byte2Double(byte[] inData, boolean byteSwap) { int j = 0, upper, lower; int length = inData.length / 8; double[] outData = new double[length]; if (!byteSwap) for (int i = 0; i < length; i++) { j = i * 8; upper = (((inData[j] & 0xff) << 24) + ((inData[j + 1] & 0xff) << 16) + ((inData[j + 2] & 0xff) << 8) + ((inData[j + 3] & 0xff) << 0)); lower = (((inData[j + 4] & 0xff) << 24) + ((inData[j + 5] & 0xff) << 16) + ((inData[j + 6] & 0xff) << 8) + ((inData[j + 7] & 0xff) << 0)); outData[i] = Double.longBitsToDouble((((long) upper) << 32) + (lower & 0xffffffffl)); } else for (int i = 0; i < length; i++) { j = i * 8; upper = (((inData[j + 7] & 0xff) << 24) + ((inData[j + 6] & 0xff) << 16) + ((inData[j + 5] & 0xff) << 8) + ((inData[j + 4] & 0xff) << 0)); lower = (((inData[j + 3] & 0xff) << 24) + ((inData[j + 2] & 0xff) << 16) + ((inData[j + 1] & 0xff) << 8) + ((inData[j] & 0xff) << 0)); outData[i] = Double.longBitsToDouble((((long) upper) << 32) + (lower & 0xffffffffl)); } return outData; } 
+1
Jul 26 '15 at 13:00
source share



All Articles