Win a copy of Functional Reactive Programming this week in the Other Languages forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

long in a byte array

 
Santoshkumar Jeevan Pawar
Greenhorn
Posts: 27
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I want to store a long in a byte array, transfer it over a network, then convert it back to a long.And In Java, a long is 8 bytes not 4.
But i want it a 4 bytes,is there any way to convert .
 
W. Joe Smith
Ranch Hand
Posts: 710
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
EDIT:

I totally misread the OP. My response was not relevent.
 
Jesper de Jong
Java Cowboy
Saloon Keeper
Posts: 15485
43
Android IntelliJ IDE Java Scala Spring
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Well, 4 bytes is obviously not enough to store all possible values that a long can have in Java, so no, there is no way you're ever going to fit an 8-byte large long into 4 bytes.
 
Rob Spoor
Sheriff
Pie
Posts: 20667
65
Chrome Eclipse IDE Java Windows
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Force the long into an int, then use ByteBuffer for the conversion of int to long:
 
naresh voota
Greenhorn
Posts: 9
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
putting long in int will reduce the precision of the value stored.

long l = 9;
String s= Long.toString(l);
byte[] b = s.getBytes();

hopefully this will help. Thanks.
 
naresh voota
Greenhorn
Posts: 9
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
putting long in int will reduce the precision of the value stored.

long l = 9;
String s= Long.toString(l);
byte[] b = s.getBytes();

once you pass this byte array over network,

String s = new String(b);
Long l = Long.valueOf(s);

hopefully this will help. Thanks.
 
Steve Luke
Bartender
Posts: 4181
22
IntelliJ IDE Java Python
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
naresh voota wrote:putting long in int will reduce the precision of the value stored.

long l = 9;
String s= Long.toString(l);
byte[] b = s.getBytes();

once you pass this byte array over network,

String s = new String(b);
Long l = Long.valueOf(s);

hopefully this will help. Thanks.


That works for values less than 10,000. Once you get to 10,000 you need 5 bytes to hold the String, so, you loose even more than you do when you convert to int. Oh, and any value less than 1,000 would take 3 or fewer bytes, so then you would have to test if < 1000, pad byte array, else if > 9999, throw bytes away.
 
Bauke Scholtz
Ranch Hand
Posts: 2458
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Steve Luke wrote:
That works for values less than 10,000.
Correction: less than Integer.MAX_VALUE.
One byte is 8 bits, you know.
 
Mike Simmons
Ranch Hand
Posts: 3090
14
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
No, if you look at the code Steve is referring to, one byte ends up representing one character in a String representation. So the largest number that can be represented this way is 9999, at four digits. Of course this isn't a very good way to try to fit a long into 4 bytes. Simply casting to int would be easier, and covers a wiser range of possible values.
 
Steve Luke
Bartender
Posts: 4181
22
IntelliJ IDE Java Python
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Bauke Scholtz wrote:
Steve Luke wrote:
That works for values less than 10,000.
Correction: less than Integer.MAX_VALUE.
One byte is 8 bits, you know.


That is true for the answers suggesting to use a cast to int. Naresh, whom I was responding to, suggested converting the long to a String, then the String to byte[]. When you do this and have more than 4 characters (digits) you get more than 4 bytes. See:


output:

Length of byte[] for 10000 is: 5
 
Santoshkumar Jeevan Pawar
Greenhorn
Posts: 27
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hello all,

Here we lose the actual value,please check below code when we typecast from long to int.


long l = new Date().getTime(); //1238583275781
int i = (int)myLong; // value becomes 1633321080

System.out.println(new Date(i));
System.out.println(new Date(myLong));

But at the same time i dont want to lose actual value......

Thank You.
Have a Nice Time.

-Santosh
 
Rob Spoor
Sheriff
Pie
Posts: 20667
65
Chrome Eclipse IDE Java Windows
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Santoshkumar Jeevan Pawar wrote:But at the same time i dont want to lose actual value......

Then you have no choice but to increase your array size to 8. A long simply requires 64 bits (= 8 bytes), nothing more and nothing less. By trying to squeeze it into an int you lose information. You can also convert the long to a float (4 bytes), but then you lose precision on the lower end:

Output:
1238583275781
1238583214080

So the only way to keep your actual value is: make sure you send the actual complete long.
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic