Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Java > Help with byte[8] to long

Reply
Thread Tools

Help with byte[8] to long

 
 
jeffdeanda@gmail.com
Guest
Posts: n/a
 
      10-26-2005
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] << 4 |
(b[2] << 40) |
(b[3] << 32) |
(b[4] << 24) |
(b[5] << 16) |
(b[6] << |
(b[7] << 0));

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

 
Reply With Quote
 
 
 
 
Roedy Green
Guest
Posts: n/a
 
      10-26-2005
On 25 Oct 2005 18:03:58 -0700, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote, quoted or
indirectly quoted someone who said :

>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.
--
Canadian Mind Products, Roedy Green.
http://mindprod.com Java custom programming, consulting and coaching.
 
Reply With Quote
 
 
 
 
Nigel Wade
Guest
Posts: n/a
 
      10-26-2005
(E-Mail Removed) wrote:

> 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] << 4 |
> (b[2] << 40) |
> (b[3] << 32) |
> (b[4] << 24) |
> (b[5] << 16) |
> (b[6] << |
> (b[7] << 0));
>
> System.out.println(Long.toString(l) + "\n");


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

--
Nigel Wade, System Administrator, Space Plasma Physics Group,
University of Leicester, Leicester, LE1 7RH, UK
E-mail : (E-Mail Removed)
Phone : +44 (0)116 2523548, Fax : +44 (0)116 2523555
 
Reply With Quote
 
charles_n_may@yahoo.com
Guest
Posts: n/a
 
      10-26-2005
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] << 4 |
((long)b[2] << 40) |
((long)b[3] << 32) |
((long)b[4] << 24) |
((long)b[5] << 16) |
((long)b[6] << |
((long)b[7] << 0);

 
Reply With Quote
 
jeffdeanda@gmail.com
Guest
Posts: n/a
 
      10-26-2005
Thanks for the help. Got it to work.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Having compilation error: no match for call to (const __gnu_cxx::hash<long long int>) (const long long int&) veryhotsausage C++ 1 07-04-2008 05:41 PM
Use of Long and Long Long Bart C C Programming 27 01-15-2008 05:27 AM
long long and long Mathieu Dutour C Programming 4 07-24-2007 11:15 AM
unsigned long long int to long double Daniel Rudy C Programming 5 09-20-2005 02:37 AM
Assigning unsigned long to unsigned long long George Marsaglia C Programming 1 07-08-2003 05:16 PM



Advertisments