package com.ard.utils.other; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.zip.CRC32; /** * @Description: 字节工具类 * @ClassName: byteUtils * @Author: 刘苏义 * @Date: 2023年07月03日15:18 * @Version: 1.0 **/ public class ByteUtils { /** * byte数组转中文字符串 */ public static String bytesToStringZh(byte[] bytes) { String zhStr = ""; try { int position = ByteUtils.findIndexOfDoubleZero(bytes); if (position != -1) { byte[] result = new byte[position]; System.arraycopy(bytes, 0, result, 0, position); zhStr = new String(result, "GBK"); } else { zhStr = new String(bytes, "GBK"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return zhStr; } /** * Byte字节转Hex * * @param b 字节 * @return Hex */ public static String byteToHex(byte b) { String hexString = Integer.toHexString(b & 0xFF); //由于十六进制是由0~9、A~F来表示1~16,所以如果Byte转换成Hex后如果是<16,就会是一个字符(比如A=10),通常是使用两个字符来表示16进制位的, //假如一个字符的话,遇到字符串11,这到底是1个字节,还是1和1两个字节,容易混淆,如果是补0,那么1和1补充后就是0101,11就表示纯粹的11 if (hexString.length() < 2) { hexString = new StringBuilder(String.valueOf(0)).append(hexString).toString(); } return hexString.toUpperCase(); } /** * byte数组转float */ public static float bytesToFloat(byte[] bytes) { ByteBuffer buffer = ByteBuffer.wrap(bytes); return buffer.getFloat(); } /** * byte数组转整型 */ public static int bytesToDecimal(byte[] byteArray) { int decimalValue = 0; for (int i = 0; i < byteArray.length; i++) { decimalValue = (decimalValue << 8) | (byteArray[i] & 0xFF); } return decimalValue; } /** * byte数组转Double */ public static double bytesToDouble(byte[] byteArray) { long longBits = 0; // 根据字节数组的长度和字节顺序,将字节数组转换为长整型 for (int i = 0; i < byteArray.length; i++) { longBits |= (long) (byteArray[i] & 0xFF) << (8 * (byteArray.length - 1 - i)); } // 使用Double.longBitsToDouble方法将长整型转换为Double类型 return Double.longBitsToDouble(longBits); } /** * 大端转小端 */ public static byte[] toLittleEndian(byte[] bigEndianBytes) { byte[] littleEndianBytes = new byte[bigEndianBytes.length]; for (int i = 0; i < bigEndianBytes.length; i++) { int j = bigEndianBytes.length - i - 1; littleEndianBytes[i] = bigEndianBytes[j]; } return littleEndianBytes; } /** * 小端转大端 */ public static byte[] toBigEndian(byte[] littleEndianBytes) { byte[] bigEndianBytes = new byte[littleEndianBytes.length]; for (int i = 0; i < littleEndianBytes.length; i++) { bigEndianBytes[i] = littleEndianBytes[littleEndianBytes.length - 1 - i]; } return bigEndianBytes; } /** * int转byte数组 */ public static byte[] decimalToBytes(int decimalValue) { ByteBuffer buffer = ByteBuffer.allocate(Integer.BYTES); buffer.putInt(decimalValue); return buffer.array(); } /** * byte数组拼接 */ public static byte[] appendArrays(byte[]... arrays) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { for (byte[] array : arrays) { outputStream.write(array); } } catch (Exception e) { e.printStackTrace(); } return outputStream.toByteArray(); } /** * byte数组CRC32校验 */ public static byte[] parseCrc32(byte[] bytes) { CRC32 crc32 = new CRC32(); crc32.update(bytes); bytes = ByteUtils.decimalToBytes((int) crc32.getValue()); bytes = ByteUtils.toBigEndian(bytes); // System.out.print("校验:"+DatatypeConverter.printHexBinary(bytes));//打印crc32的校验值 return bytes; } /** * 去除包头包尾 * 刘苏义 * 2023/7/4 11:24 */ public static byte[] removeHeaderAndFooter(byte[] data, int headerLength, int footerLength) { int payloadLength = data.length - headerLength - footerLength; byte[] payload = new byte[payloadLength]; System.arraycopy(data, headerLength, payload, 0, payloadLength); return payload; } /** * 去除包头包尾crc校验 * 刘苏义 * 2023/7/4 11:24 */ public static byte[] removeHeaderFooterAndCRC(byte[] data, int headerLength, int footerLength, int crcLength) { int payloadLength = data.length - headerLength - footerLength - crcLength; byte[] payload = new byte[payloadLength]; System.arraycopy(data, headerLength, payload, 0, payloadLength); return payload; } /** * 获取后面的字节数组 * 刘苏义 * 2023/7/4 11:24 */ public static byte[] getLastBytes(byte[] data, int count) { int startIndex = data.length - count; byte[] lastBytes = new byte[count]; System.arraycopy(data, startIndex, lastBytes, 0, count); return lastBytes; } /** * 找到00的索引位置 */ public static int findIndexOfDoubleZero(byte[] bytes) { for (int i = 0; i < bytes.length - 1; i++) { if (bytes[i] == 0x00) { return i; } } return -1; } }