热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

java处理字节的常用工具类

这篇文章主要为大家详细介绍了java处理字节的常用工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

处理字节的常用工具类方法,供大家参考,具体内容如下

package com.demo.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * 处理字节的常用工具类方法
 * @author dongyangyang
 * @Date 2017/3/13 12:31
 * @Version 1.0
 *
 */
public class ByteUtils {

 /**
  * 构造新字节时需要与的值表
  */
 private static final byte[] BUILD_BYTE_TABLE = new byte[] { (byte) 128, (byte) 64, (byte) 32, (byte) 16, (byte) 8, (byte) 4, (byte) 2, (byte) 1 };

 private ByteUtils() {}

 /**
  * short转换到字节数组
  * 
  * @param number
  *   需要转换的数据。
  * @return 转换后的字节数组。
  */
 public static byte[] shortToByte(short number) {
  byte[] b = new byte[2];
  for (int i = 1; i >= 0; i--) {
   b[i] = (byte) (number % 256);
   number >>= 8;
  }
  return b;
 }

 /**
  * 字节到short转换
  * 
  * @param b
  *   short的字节数组
  * @return short数值。
  */
 public static short byteToShort(byte[] b) {
  return (short) ((((b[0] & 0xff) <<8) | b[1] & 0xff));
 }

 /**
  * 整型转换到字节数组
  * 
  * @param number
  *   整形数据。
  * @return 整形数据的字节数组。
  */
 public static byte[] intToByte(int number) {
  byte[] b = new byte[4];
  for (int i = 3; i >= 0; i--) {
   b[i] = (byte) (number % 256);
   number >>= 8;
  }
  return b;
 }

 /**
  * 字节数组到整型转换
  * 
  * @param b
  *   整形数据的字节数组。
  * @return 字节数组转换成的整形数据。
  */
 public static int byteToInt(byte[] b) {
  return ((((b[0] & 0xff) <<24) | ((b[1] & 0xff) <<16) | ((b[2] & 0xff) <<8) | (b[3] & 0xff)));
 }

 /**
  * long转换到字节数组
  * 
  * @param number
  *   长整形数据。
  * @return 长整形转换成的字节数组。
  */
 public static byte[] longToByte(long number) {
  byte[] b = new byte[8];
  for (int i = 7; i >= 0; i--) {
   b[i] = (byte) (number % 256);
   number >>= 8;
  }
  return b;
 }

 /**
  * 字节数组到整型的转换
  * 
  * @param b
  *   长整形字节数组。
  * @return 长整形数据。
  */
 public static long byteToLong(byte[] b) {
  return ((((long) b[0] & 0xff) <<56) | (((long) b[1] & 0xff) <<48) | (((long) b[2] & 0xff) <<40) | (((long) b[3] & 0xff) <<32) | (((long) b[4] & 0xff) <<24)
    | (((long) b[5] & 0xff) <<16) | (((long) b[6] & 0xff) <<8) | ((long) b[7] & 0xff));
 }

 /**
  * double转换到字节数组
  * 
  * @param d
  *   双精度浮点。
  * @return 双精度浮点的字节数组。
  */
 public static byte[] doubleToByte(double d) {
  byte[] bytes = new byte[8];
  long l = Double.doubleToLongBits(d);
  for (int i = 0; i > 8;
  }
  return bytes;
 }

 /**
  * 字节数组到double转换
  * 
  * @param b
  *   双精度浮点字节数组。
  * @return 双精度浮点数据。
  */
 public static double byteToDouble(byte[] b) {
  long l;
  l = b[0];
  l &= 0xff;
  l |= ((long) b[1] <<8);
  l &= 0xffff;
  l |= ((long) b[2] <<16);
  l &= 0xffffff;
  l |= ((long) b[3] <<24);
  l &= 0xffffffffl;
  l |= ((long) b[4] <<32);
  l &= 0xffffffffffl;

  l |= ((long) b[5] <<40);
  l &= 0xffffffffffffl;
  l |= ((long) b[6] <<48);
  l &= 0xffffffffffffffl;

  l |= ((long) b[7] <<56);

  return Double.longBitsToDouble(l);
 }

 /**
  * float转换到字节数组
  * 
  * @param d
  *   浮点型数据。
  * @return 浮点型数据转换后的字节数组。
  */
 public static byte[] floatToByte(float d) {
  byte[] bytes = new byte[4];
  int l = Float.floatToIntBits(d);
  for (int i = 0; i > 8;
  }
  return bytes;
 }

 /**
  * 字节数组到float的转换
  * 
  * @param b
  *   浮点型数据字节数组。
  * @return 浮点型数据。
  */
 public static float byteToFloat(byte[] b) {
  int l;
  l = b[0];
  l &= 0xff;
  l |= ((long) b[1] <<8);
  l &= 0xffff;
  l |= ((long) b[2] <<16);
  l &= 0xffffff;
  l |= ((long) b[3] <<24);
  l &= 0xffffffffl;

  return Float.intBitsToFloat(l);
 }

 /**
  * 字符串到字节数组转换
  * 
  * @param s
  *   字符串。
  * @param charset
  *   字符编码
  * @return 字符串按相应字符编码编码后的字节数组。
  */
 public static byte[] stringToByte(String s, Charset charset) {
  return s.getBytes(charset);
 }

 /**
  * 字节数组带字符串的转换
  * 
  * @param b
  *   字符串按指定编码转换的字节数组。
  * @param charset
  *   字符编码。
  * @return 字符串。
  */
 public static String byteToString(byte[] b, Charset charset) {
  return new String(b, charset);
 }

 /**
  * 对象转换成字节数组。
  * 
  * @param obj
  *   字节数组。
  * @return 对象实例相应的序列化后的字节数组。
  * @throws IOException
  */
 public static byte[] objectToByte(Object obj) throws IOException {
  ByteArrayOutputStream buff = new ByteArrayOutputStream();
  ObjectOutputStream out = new ObjectOutputStream(buff);
  out.writeObject(obj);
  try {
   return buff.toByteArray();
  } finally {
   out.close();
  }
 }

 /**
  * 序死化字节数组转换成实际对象。
  * 
  * @param b
  *   字节数组。
  * @return 对象。
  * @throws IOException
  * @throws ClassNotFoundException
  */
 public static Object byteToObject(byte[] b) throws IOException, ClassNotFoundException {
  ByteArrayInputStream buff = new ByteArrayInputStream(b);
  ObjectInputStream in = new ObjectInputStream(buff);
  Object obj = in.readObject();
  try {
   return obj;
  } finally {
   in.close();
  }
 }

 /**
  * 比较两个字节的每一个bit位是否相等.
  * 
  * @param a
  *   比较的字节.
  * @param b
  *   比较的字节
  * @return ture 两个字节每一位都相等,false有至少一位不相等.
  */
 public static boolean equalsBit(byte a, byte b) {
  return Arrays.equals(byteToBitArray(a), byteToBitArray(b));
 }

 /**
  * 比较两个数组中的每一个字节,两个字节必须二进制字节码每一位都相同才表示两个 byte相同.
  * 
  * @param a
  *   比较的字节数组.
  * @param b
  *   被比较的字节数.
  * @return ture每一个元素的每一位两个数组都是相等的,false至少有一位不相等.
  */
 public static boolean equalsBit(byte[] a, byte[] b) {
  if (a == b) {
   return true;
  }
  if (a == null || b == null) {
   return false;
  }

  int length = a.length;
  if (b.length != length) {
   return false;
  }

  for (int count = 0; count = 0; i--) {
   buff[index++] = ((b >>> i) & 1) == 1;
  }
  return buff;
 }

 /**
  * 返回指定字节中指定bit位,true为1,false为0. 指定的位从0-7,超出将抛出数据越界异常.
  *
  * @param b
  *   需要判断的字节.
  * @param index
  *   字节中指定位.
  * @return 指定位的值.
  */
 public static boolean byteBitValue(byte b, int index) {
  return byteToBitArray(b)[index];
 }

 /**
  * 根据布尔数组表示的二进制构造一个新的字节.
  * 
  * @param values
  *   布尔数组,其中true表示为1,false表示为0.
  * @return 构造的新字节.
  */
 public static byte buildNewByte(boolean[] values) {
  byte b = 0;
  for (int i = 0; i <8; i++) {
   if (values[i]) {
    b |= BUILD_BYTE_TABLE[i];
   }
  }
  return b;
 }

 /**
  * 将指定字节中的某个bit位替换成指定的值,true代表1,false代表0.
  * 
  * @param b
  *   需要被替换的字节.
  * @param index
  *   位的序号,从0开始.超过7将抛出越界异常.
  * @param newValue
  *   新的值.
  * @return 替换好某个位值的新字节.
  */
 public static byte changeByteBitValue(byte b, int index, boolean newValue) {
  boolean[] bitValues = byteToBitArray(b);
  bitValues[index] = newValue;
  return buildNewByte(bitValues);
 }

 /**
  * 将指定的IP地址转换成字节表示方式. IP数组的每一个数字都不能大于255,否则将抛出IllegalArgumentException异常.
  *
  * @param ipNums
  *   IP地址数组.
  * @return IP地址字节表示方式.
  */
 public static byte[] ipAddressBytes(String address) {
  if (address == null || address.length() <0 || address.length() > 15) {
   throw new IllegalArgumentException("Invalid IP address.");
  }

  final int ipSize = 4;// 最大IP位数
  final char ipSpace = '.';// IP数字的分隔符
  int[] ipNums = new int[ipSize];
  StringBuilder number = new StringBuilder();// 当前操作的数字
  StringBuilder buff = new StringBuilder(address);
  int point = 0;// 当前操作的数字下标,最大到3.
  char currentChar;
  for (int i = 0; i  0) {
     throw new IllegalArgumentException("Invalid IP address.");
    }
    ipNums[point++] = Integer.parseInt(number.toString());
    number.delete(0, number.length());
   } else {
    number.append(currentChar);
   }
  }
  ipNums[point] = Integer.parseInt(number.toString());

  byte[] ipBuff = new byte[ipSize];
  int pointNum = 0;
  for (int i = 0; i <4; i++) {
   pointNum = Math.abs(ipNums[i]);
   if (pointNum > 255) {
    throw new IllegalArgumentException("Invalid IP address.");
   }
   ipBuff[i] = (byte) (pointNum & 0xff);
  }

  return ipBuff;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 获取 苹果UDID 序列号
    UDID是什么?UDID是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括iPhones,iPads,以及iPodtouches,这些编码看起来是随机的,实际上是 ... [详细]
  • openstack安装和使用
    前言本篇文章会介绍openstack的安装、openstack各组件的配置和功能、还会演示openstack云主机的创建流程,整篇文章花费一天时间完成, ... [详细]
  • 苹果在今天凌晨正式推送了iPadOS,作为一款专门针对iPad打造的系统,虽然是在iOS的基础上演变而来,但是前者对iPad进行了特别的优化。iPadOS的主屏幕经过重 ... [详细]
  • 界面易上手同时又具有专业工具实力,68元买断无内购的售价,再加上持续多年免费更新,Procreate凭借上述优势已经成为iPad绘画App中最知名的一款平板画面设置 ... [详细]
  • AsyncDisplayKit2.0教程(下)
    AsyncDisplayKit2.0Tutorial:AutomaticLayout原文:AsyncDisplayKit2.0Tutorial:Automatic ... [详细]
  • CentOS 7.6网卡绑定mode1
    CentOS7.6网卡绑定mode1[root@server~]#systemctlstopNetworkManager[root@server~]#systemctldisabl ... [详细]
  • ThinkPad安卓平板电脑你动心了吗,反正我是动心了_我是亲民_新浪博客
    联想可能是看到iPad和安卓平板,特别是三星的,赚了那么多银子,终于也按耐不住了,推出一款有争议的产品,安卓版 ... [详细]
  • 情况说明最近打开Github经常会遇到用户头像或者仓库中的图片无法预览。F12打开控制台也能看到一堆报错信息。解决方法找到hosts文件Win:C:\Windows\Sys ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
author-avatar
U友50082089
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有