将8字节转化为长整型变负数了, 如何正确将字节转成long ?

qazwsxhai 2015-12-25 03:26:04
我的转换函数为:



public long bytesToLong(byte[] b) {
long l = ((long) b[0] << 56) & 0xFF00000000000000L;
// 如果不强制转换为long,那么默认会当作int,导致最高32位丢失
l |= ((long) b[1] << 48) & 0xFF000000000000L;
l |= ((long) b[2] << 40) & 0xFF0000000000L;
l |= ((long) b[3] << 32) & 0xFF00000000L;
l |= ((long) b[4] << 24) & 0xFF000000L;
l |= ((long) b[5] << 16) & 0xFF0000L;
l |= ((long) b[6] << 8) & 0xFF00L;
l |= (long) b[7] & 0xFFL;
return l;
}


原来是 3458914030446034124 转成字节发过来 通过上面函数 转化为了成 -3693979677744496590
请64位(8字节)的整数 如何从字节转到long型??
...全文
694 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
解开者 2015-12-29
  • 打赏
  • 举报
回复
全用jdk方法也可以转
long l = 3458914030446034124L;
		byte[] b = new Long(l).toString().getBytes();
		long ll = new Long(new String(b));
		System.out.println(ll);
qazwsxhai 2015-12-25
  • 打赏
  • 举报
回复
其实就是字节的高低位不同引起的.
qazwsxhai 2015-12-25
  • 打赏
  • 举报
回复
引用 3 楼 u011225629 的回复:
//byte数组转成long public static long byteToLong(byte[] b) { long s = 0; long s0 = b[0] & 0xff;// 最低位 long s1 = b[1] & 0xff; long s2 = b[2] & 0xff; long s3 = b[3] & 0xff; long s4 = b[4] & 0xff;// 最低位 long s5 = b[5] & 0xff; long s6 = b[6] & 0xff; long s7 = b[7] & 0xff; // s0不变 s1 <<= 8; s2 <<= 16; s3 <<= 24; s4 <<= 8 * 4; s5 <<= 8 * 5; s6 <<= 8 * 6; s7 <<= 8 * 7; s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7; return s; }
谢谢大家, 这个代码完没解决问题!!! @rickylin86 也谢谢你, 你这边也不能正确解释的.
君莫傲 2015-12-25
  • 打赏
  • 举报
回复
//byte数组转成long public static long byteToLong(byte[] b) { long s = 0; long s0 = b[0] & 0xff;// 最低位 long s1 = b[1] & 0xff; long s2 = b[2] & 0xff; long s3 = b[3] & 0xff; long s4 = b[4] & 0xff;// 最低位 long s5 = b[5] & 0xff; long s6 = b[6] & 0xff; long s7 = b[7] & 0xff; // s0不变 s1 <<= 8; s2 <<= 16; s3 <<= 24; s4 <<= 8 * 4; s5 <<= 8 * 5; s6 <<= 8 * 6; s7 <<= 8 * 7; s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7; return s; }
rickylin86 2015-12-25
  • 打赏
  • 举报
回复
刚试了下.用二进制移位来处理好像总有精度损失.一般的话都是用管道传输,然后缓冲区转换.这样好像就没问题。

import java.nio.ByteBuffer;

public class Test{
	public static void main(String[] args){
		ByteBuffer buf = ByteBuffer.allocate(8);
		long value = 3458914030446034124L;
		buf.putLong(value);
		buf.flip();
		byte[] bs = buf.array();
		long result = byte2Long(bs);
		System.out.println(result);
	}

	private static long byte2Long(byte[] bs){
		assert bs.length >= 8;
		ByteBuffer buf = ByteBuffer.allocate(bs.length);
		buf.put(bs);
		buf.flip();
		long result = buf.getLong();
		return result;
	}

	private static long byte2Long_1(byte[] bs){
		assert bs.length >= 8;
		long result = 0L;

		for(int i = 0 ; i < 8 ; i ++){
			result += ((long)bs[i] << (7-i) * 8);
			
		}

		return result;
	}
}
dracularking 2015-12-25
  • 打赏
  • 举报
回复
转成的byte是什么呢

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧