欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java处理字节的常用工具类

程序员文章站 2023-11-06 12:15:16
处理字节的常用工具类方法,供大家参考,具体内容如下 package com.demo.utils; import java.io.bytearrayinpu...

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

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 < bytes.length; i++) {
      bytes[i] = long.valueof(l).bytevalue();
      l = l >> 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 < bytes.length; i++) {
      bytes[i] = integer.valueof(l).bytevalue();
      l = l >> 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 < a.length; count++) {
      if (!equalsbit(a[count], b[count])) {
        return false;
      }
    }
    return true;
  }

  /**
   * 返回某个字节的bit组成的字符串.
   * 
   * @param b
   *      字节.
   * @return bit位组成的字符串.
   */
  public static string bitstring(byte b) {
    stringbuilder buff = new stringbuilder();
    boolean[] array = bytetobitarray(b);
    for (int i = 0; i < array.length; i++) {
      buff.append(array[i] ? 1 : 0);
    }
    return buff.tostring();
  }

  /**
   * 计算出给定byte中的每一位,并以一个布尔数组返回. true表示为1,false表示为0.
   * 
   * @param b
   *      字节.
   * @return 指定字节的每一位bit组成的数组.
   */
  public static boolean[] bytetobitarray(byte b) {
    boolean[] buff = new boolean[8];
    int index = 0;
    for (int i = 7; i >= 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 < buff.length(); i++) {
      currentchar = buff.charat(i);
      if (ipspace == currentchar) {
        // 当前位置等于最大于序号后,还有字符没有处理表示这是一个错误的ip.
        if (point == ipsize - 1 && buff.length() - (i + 1) > 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;
  }
}

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