解决方案 »
- 一点小小的疑问,请教大家
- 怎么样才能调用第二个构造方法呢?为什么会发生数组越界呢?
- 到底什么情况才需要手动重启tomcat
- 对于已经定义 final JPanel jpa=new JPanel()的面板可以重新设置布局管理器吗?
- 这个APPLET为什么在我的机器上执行不了?
- 怎么设置环境变量,使得能调用WEB SERVET类
- 如何生成标准的JAVA API文档
- 关于Jbuilder7安装问题
- 《——谁知道有好用的邮件系统,100分相送——》
- 用过JET的朋友,想请教一个问题
- java 类库里的接口(如Comparator,定义了Object类已存在的方法,这有什么意义?
- java如何实现自动按键?
不过你可以参考
1. datainputstream的readlong
2. dataoutputstream的writelong
另外判断条件换一下,避免异常。代码: public static long readUnit64(ByteBuffer buf){
int l = 0;
long rst = 0L;
//while(l<64){
while(buf.position()<buf.limit()){//换一下判断条件
long t = (int)buf.get();//t改成long
rst |= (t & 127) << l;
if((t & 128) == 0)
return rst;
l += 7;
}
return rst;//返回rst.
}
buf.put((byte)(128 | 127 & (int)val));
这一句 存在问题 val 你定义为long型 在这里被强转成了 int型 丢失了精度 如果没分析错的话 问题不是 多少位数字
你给的数只要大于Integer.MAX_VALUE 就出问题long强转int 直接丢弃 前4个字节反过来 int转long 就是根据正负数在前面加上4个字节的0或1readUnit64方法我没看
int l = 0;
long rst = 0L;
while (l < 64) {
int t = buf.get();
rst |= ((long) (t & 0x7f) << l); // 只是这句话而已
if ((t & 0x80) == 0)
return rst;
l += 7;
}
return 0;
}
rst |= (long)((t & 127) << l);
因为(t & 127) << l 溢出了 int 的范围,所以造成符号位。修正方法就是要在做移位前先强转 long。那么 4 楼直接把t定义为long,所以也是可以解决问题的。
int t = buf.get(); //这里int改为byte较好
buf.put((byte)(int)val); //这里的int转型貌似没必要
buf.put((byte)(128 | 127 & (int)val)); //这里int转型貌似也没必要