How to convert a byte array to its numeric value (Java)?
Solution 1
Assuming the first byte is the least significant byte:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value += ((long) by[i] & 0xffL) << (8 * i);
}
Is the first byte the most significant, then it is a little bit different:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value = (value << 8) + (by[i] & 0xff);
}
Replace long with BigInteger, if you have more than 8 bytes.
Thanks to Aaron Digulla for the correction of my errors.
Solution 2
One could use the Buffer
s that are provided as part of the java.nio
package to perform the conversion.
Here, the source byte[]
array has a of length 8, which is the size that corresponds with a long
value.
First, the byte[]
array is wrapped in a ByteBuffer
, and then the ByteBuffer.getLong
method is called to obtain the long
value:
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();
System.out.println(l);
Result
4
I'd like to thank dfa for pointing out the ByteBuffer.getLong
method in the comments.
Although it may not be applicable in this situation, the beauty of the Buffer
s come with looking at an array with multiple values.
For example, if we had a 8 byte array, and we wanted to view it as two int
values, we could wrap the byte[]
array in an ByteBuffer
, which is viewed as a IntBuffer
and obtain the values by IntBuffer.get
:
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);
System.out.println(i0);
System.out.println(i1);
Result:
1
4
Solution 3
Simply, you could use or refer to guava lib provided by google, which offers utiliy methods for conversion between long and byte array. My client code:
long content = 212000607777l;
byte[] numberByte = Longs.toByteArray(content);
logger.info(Longs.fromByteArray(numberByte));
Solution 4
If this is an 8-bytes numeric value, you can try:
BigInteger n = new BigInteger(byteArray);
If this is an UTF-8 character buffer, then you can try:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
Solution 5
You can also use BigInteger for variable length bytes. You can convert it to Long, Integer or Short, whichever suits your needs.
new BigInteger(bytes).intValue();
or to denote polarity:
new BigInteger(1, bytes).intValue();
pirate
Updated on July 17, 2021Comments
-
pirate almost 3 years
I have an 8 byte array and I want to convert it to its corresponding numeric value.
e.g.
byte[] by = new byte[8]; // the byte array is stored in 'by' // CONVERSION OPERATION // return the numeric value
I want a method that will perform the above conversion operation.
-
Laurence Gonsalves almost 15 yearsI would've voted for this answer if it ended right after the first code snippet, or if it included some code to convert the string into a "numeric value". As-is, the second half of your answer seems like a non sequitur.
-
Vincent Robert almost 15 yearsNot what I meant in the first place, I changed my answer
-
Aaron Digulla almost 15 years-1 bytes are signed values! And replace pow() with shift (<<)! "value = (value << 8) + (by[i] & 0xff)"
-
dfa almost 15 yearswhat about ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4}).getLong()? this method should read next 8 byte and convert them to a long
-
coobird almost 15 years@dfa: Thanks for pointing that out, it sure seems to work -- I'll edit the answer. :)
-
suraj about 12 yearsDoes the shift operator(<<) has right to left precedence? How does above code works? Its working all fine for me. Just wanna know the working. Thanx in advance
-
suraj about 12 years@Mnementh : Does the shift operator(<<) has right to left precedence? How does above code works? Its working all fine for me. Just wanna know the working. Thanx in advance
-
Luke about 12 yearsIn case anyone else has the same issue I did, in the first example, by[i] must be cast to a long, otherwise it only works for values less than 2^32. That is,
value += ((long)by[i] & 0xffL) << (8 * i);
-
Luke over 8 yearsJust a note that I needed to use 0xFFL, otherwise the cast from int 0xFF to long had a whole lot of incorrect 1 bits set when I printed Long.toHexString(l).
-
will.fiset over 6 years
-
Gray almost 5 yearsYou need to use 0xFFL otherwise you get sign extension.