Help with byte[8] to long

J

jeffdeanda

I'm having trouble converting a byte array to long. The code below
results in a long value of 4096, which is way off. If I remove on or
the other values and replace it with 0 it still results in the same
outcome. I'm thinking there's a problem with the shifting in the 2nd to
last line, but am unable to figure it out. Any thoughts?

Here's the code:

short[] ss = new short[4];
ss[0] = 0;
ss[1] = 4096;
ss[2] = 0;
ss[3] = 4096;

byte[] b = new byte[8];
b[0] = (byte)(ss[0] >> 8 & 0x0FF);
b[1] = (byte)(ss[0] >> 0 & 0x0FF);
b[2] = (byte)(ss[1] >> 8 & 0x0FF);
b[3] = (byte)(ss[1] >> 0 & 0x0FF);
b[4] = (byte)(ss[2] >> 8 & 0x0FF);
b[5] = (byte)(ss[2] >> 0 & 0x0FF);
b[6] = (byte)(ss[3] >> 8 & 0x0FF);
b[7] = (byte)(ss[3] >> 0 & 0x0FF);

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

System.out.println(Long.toString(l) + "\n");
 
R

Roedy Green

I'm having trouble converting a byte array to long. The code below
results in a long value of 4096, which is way off. If I remove on or
the other values and replace it with 0 it still results in the same
outcome. I'm thinking there's a problem with the shifting in the 2nd to
last line, but am unable to figure it out. Any thoughts?

Have a look at http://mindprod.com/jgloss/endian.html

IT contains codes for taking longs apart into bytes and putting them
together again in the opposite byte sex order.

You can use half the code.
 
N

Nigel Wade

I'm having trouble converting a byte array to long. The code below
results in a long value of 4096, which is way off. If I remove on or
the other values and replace it with 0 it still results in the same
outcome. I'm thinking there's a problem with the shifting in the 2nd to
last line, but am unable to figure it out. Any thoughts?

Here's the code:

short[] ss = new short[4];
ss[0] = 0;
ss[1] = 4096;
ss[2] = 0;
ss[3] = 4096;

byte[] b = new byte[8];
b[0] = (byte)(ss[0] >> 8 & 0x0FF);
b[1] = (byte)(ss[0] >> 0 & 0x0FF);
b[2] = (byte)(ss[1] >> 8 & 0x0FF);
b[3] = (byte)(ss[1] >> 0 & 0x0FF);
b[4] = (byte)(ss[2] >> 8 & 0x0FF);
b[5] = (byte)(ss[2] >> 0 & 0x0FF);
b[6] = (byte)(ss[3] >> 8 & 0x0FF);
b[7] = (byte)(ss[3] >> 0 & 0x0FF);

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

System.out.println(Long.toString(l) + "\n");

ByteBuffer bb = ByteBuffer.wrap(b);
((ShortBuffer)bb.asShortBuffer()).put(ss);
long l = bb.getLong();
 
C

charles_n_may

The problem is that the << operator returns type int unless the operand
to its left is a long. Your operands to the left of << are bytes, so
the result type of each << operation is int, and you're dropping bits
when you shift left past the 32-bit width of an int. You want your
left-hand operands to be longs so you have a 64-bit area to work in.

Try casting your left hand operands to longs, like this:

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

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top