最近在搞一个读取数据库日志,然后解析实时日志的程序,发现读取的日志id是number类型,但是得到的记录确实byte类型数组,因为byte类型的最大取值范围是-128到127,所以当number的值超出这个范围时候,byte数组就需要增加长度

byte占一个字节,如果不做处理直接付给int或long类型的变量,当高位为1时会导致得到不正确的值(负数), 如果与0xff(或者0xffL)做位与就可以保证得到byte本身的值。以下是byte和long对应的几个例子:

byte[] long
127 127
0,-128 128
0,-1 255
1,0 256
1,0,0 65536

从上表中可以看出当超高127时候byte数组多了一位-128对应int值是128 ,-127对应是129,-126对应是130 ... -1对应是255 当值为256时向前进1即{1,0}

话不多说直接上代码

public class Test {public static void main(String[] args) {byte[] b = {0,-128};byte[] b2 = {1,0};byte[] b3 = {2,-12,0};byte[] b4 = {1,0,0,0};byte[] b5 = {1,0,0,0,0};System.out.println("b的值是:"+bytesToLong(b));System.out.println("b的值是:"+bytes2long(b));System.out.println();System.out.println("b2的值是:"+bytesToLong(b2));System.out.println("b2的值是:"+bytes2long(b2));System.out.println();System.out.println("b3的值是:"+bytesToLong(b3));System.out.println("b3的值是:"+bytes2long(b3));System.out.println();System.out.println("b4的值是:"+bytesToLong(b4));System.out.println("b4的值是:"+bytes2long(b4));System.out.println();System.out.println("b5的值是:"+bytesToLong(b5));System.out.println("b5的值是:"+bytes2long(b5));}/*** 直接读取byte数组进行计算* @param bytes* @return*/public static long bytesToLong(byte[] bytes) {if(bytes.length == 1){return bytes[0];}else if(bytes.length == 2){return bytes[0] * 256 +  byte2Int(bytes[1]);}else if(bytes.length == 3){return bytes[0] * 65536 +  byte2Int(bytes[1]) * 256 + byte2Int(bytes[2]);}else if(bytes.length == 4){return bytes[0] * 16777216 + byte2Int(bytes[1]) * 65536 + byte2Int(bytes[2]) * 256 + byte2Int(bytes[3]);}else if(bytes.length == 5){return bytes[0] * 4294967296l + byte2Int(bytes[1]) * 16777216 + byte2Int(bytes[2]) * 65536 + byte2Int(bytes[3]) * 256 +  byte2Int(bytes[4]);}else if(bytes.length == 6){return bytes[0] * 1099511627776l + byte2Int(bytes[1]) * 4294967296l + byte2Int(bytes[2]) * 16777216 + byte2Int(bytes[3]) * 65536 + byte2Int(bytes[4]) * 256 +  byte2Int(bytes[5]);}else if(bytes.length == 7){return bytes[0] * 281474976710656l + byte2Int(bytes[1]) * 1099511627776l + byte2Int(bytes[2]) * 4294967296l + byte2Int(bytes[3]) * 16777216 + byte2Int(bytes[4]) * 65536 + byte2Int(bytes[5]) * 256 +  byte2Int(bytes[6]);}return 0l;}public static int byte2Int(byte b){return (int)(b & 0xff);}/*** 通过位移方式进行计算* @param bs* @return*/static long bytes2long(byte[] bs)  {int bytes = bs.length;switch(bytes) {case 0:return 0;case 1:return (long)((bs[0] & 0xff));case 2:return (long)((bs[0] & 0xff) <<8 | (bs[1] & 0xff));case 3:return (long)((bs[0] & 0xff) <<16 | (bs[1] & 0xff) <<8 | (bs[2] & 0xff));case 4:return (long)((bs[0] & 0xffL) <<24 | (bs[1] & 0xffL) << 16 | (bs[2] & 0xffL) <<8 | (bs[3] & 0xffL));case 5:return (long)((bs[0] & 0xffL) <<32 | (bs[1] & 0xffL) <<24 | (bs[2] & 0xffL) << 16 | (bs[3] & 0xffL) <<8 | (bs[4] & 0xffL));case 6:return (long)((bs[0] & 0xffL) <<40 | (bs[1] & 0xffL) <<32 | (bs[2] & 0xffL) <<24 | (bs[3] & 0xffL) << 16 | (bs[4] & 0xffL) <<8 | (bs[5] & 0xffL));case 7:return (long)((bs[0] & 0xffL) <<48 | (bs[1] & 0xffL) <<40 | (bs[2] & 0xffL) <<32 | (bs[3] & 0xffL) <<24 | (bs[4] & 0xffL) << 16 | (bs[5] & 0xffL) <<8 | (bs[6] & 0xffL));case 8:return (long)((bs[0] & 0xffL) <<56 | (bs[1] & 0xffL) << 48 | (bs[2] & 0xffL) <<40 | (bs[3] & 0xffL)<<32 |(bs[4] & 0xffL) <<24 | (bs[5] & 0xffL) << 16 | (bs[6] & 0xffL) <<8 | (bs[7] & 0xffL));default:return 0;}}
}

执行结果如下:

b的值是:128
b的值是:128b2的值是:256
b2的值是:256b3的值是:193536
b3的值是:193536b4的值是:16777216
b4的值是:16777216b5的值是:4294967296
b5的值是:4294967296

JAVA byte[]数组转long相关推荐

  1. java byte数组与String互转

    java byte数组与String互转 CreationTime--2018年7月6日14点53分 Author:Marydon 1.String-->byte[] 方法:使用String.g ...

  2. java byte数组转int数组_Java任意长度byte数组转换为int数组的方法

    前言 嗯.最近工程上遇到一个byte数组转换为int的问题,解决过程中遇到了几个坑,经过各种查资料终于还是解决了.撒花. Java的位运算以及byte数组与其他类型数据的转换比c/c++感觉麻烦一些. ...

  3. Java byte数组与十六进制字符串互转

    Java byte数组与十六进制字符串互转 博客分类: Java Javajava 十六进制java hex Java 加密解密基础 Java byte数组与十六进制字符串互转 Java BASE64 ...

  4. java 字节 操作_实例解析Java byte数组操纵方式代码

    字节数组的关键在于它为存储在该部分内存中的每个8位值提供索引(快速),精确的原始访问,并且您可以对这些字节进行操作以控制每个位. 坏处是计算机只将每个条目视为一个独立的8位数 - 这可能是你的程序正在 ...

  5. java byte数组string_byte数组和String之间的转化

    JAVA里面关于byte数组和String之间的转换问题 把byte转化成string,必须经过编码. 例如下面一个例子: import java.io.UnsupportedEncodingExce ...

  6. java byte数组 初始化_Java根据byte数组,生成文件

    根据byte数组,生成文件 自己写的小案例,找个地方记录一下 package com.seesun2012.utils; import java.io.BufferedOutputStream; im ...

  7. java byte数组操作_Byte数组操作方法集(Java.Net)

    在velocity优化时由于要将String转化为byte,所以就会涉及到一些针对byte数组的操作需要,如在一个数组中查找一个小数组.数组替换.数组扩展等操作,下面这个类就提供了这样一组方法,而且性 ...

  8. java byte数组操作_Java byte数组操纵方式代码实例解析

    字节数组的关键在于它为存储在该部分内存中的每个8位值提供索引(快速),精确的原始访问,并且您可以对这些字节进行操作以控制每个位. 坏处是计算机只将每个条目视为一个独立的8位数 - 这可能是你的程序正在 ...

  9. java byte数组转long_Java中byte、byte数组与int、long的转换详解

    一.Java 中 byte 和 int 之间的转换源码: //byte 与 int 的相互转换 public static byte intToByte(int x) { return (byte) ...

  10. java byte数组转化为流_java中字节数组和字符串、IO流和字节数组之间的转换

    在实际开发中经常会碰到乱码问题: 首先查看系统支持的编码方式,默认的编码方式 //检查java支持的编码 System.out.println(Charset.availableCharsets(). ...

最新文章

  1. 计算机书籍-R语言机器学习预测分析实战
  2. vse职位的全称_吉利汽车VSE岗(SE5AGBRC-M工资待遇怎么样 - 浙江吉利控股集团有限公司 - 职友集...
  3. python中自定义变量名标识符_name是python的标识符吗
  4. Leetcode题库234.回文链表(递归 类似双指针 c实现)
  5. 如何自行找出 SAP Spartacus 查询用户信息的 API Service 类
  6. 做一个项目,平时都用到哪些工具提高效率(中) 【转】
  7. 轻松构建Tomcat源码
  8. html做app的切换效果,Vue-router结合transition实现app动画切换效果实例分享
  9. VS2010 C++工程运行提示找不到MSVCP100D.dll
  10. 深度解密换脸应用Deepfake
  11. 春季养生男性常搓九部位补肾又健脑
  12. java练习题库_大一java题库练习题.doc
  13. AI读书笔记:《智能简史(谁会替代人类成为主导物种)》
  14. WIN10中IE双击没有反应打不开要右键以管理员身份才能运行
  15. 卿来云老师以前课程主页
  16. 【扩展】电机驱动(DRV8870)
  17. spyder 设置中文_Spyder代理设置
  18. 有了这几招,再也不怕背不过课本了!
  19. 例解BITMAP的数据格式
  20. dolphinscheduler_sql_调用时间参数

热门文章

  1. Ava 自动化测试----对函数的简单测试和对Http接口的测试
  2. flutter 顶部状态栏透明
  3. 《Adobe Illustrator CS5中文版经典教程》—第0课0.6节使用描边
  4. Spring入门自学
  5. 车载测试-HIL硬件在环测试
  6. 【时间序列】时间卷积神经网络
  7. Pytorch LSTM 长短期记忆网络
  8. VS2019安装教学
  9. 推荐给中学生的数学课外书:《写给全人类的数学魔法书》
  10. 云计算的应用有哪些?