package com.walker.tcp.util; import java.math.BigInteger; import java.text.DecimalFormat; public class ByteUtils { /** * 2进制 * * @param b * @return */ public static String toBinary(byte b) { StringBuilder stringBuilder = new StringBuilder(); String val = ByteUtils.byteToHexString(b); BigInteger integer = new BigInteger(val, 16); stringBuilder.append(integer.toString(2)); while (stringBuilder.length() < 8) { stringBuilder.insert(0, "0"); } return stringBuilder.toString(); } /** * 获取高四位 * @param data * @return */ public static int getHeight4(byte data){ int height; height = ((data & 0xf0) >> 4); return height; } /** * 获取低四位 * @param data * @return */ public static int getLow4(byte data){ int low; low = (data & 0x0f); return low; } /** * 去除int最高位 * * @param val * @return */ public static int delH(int val) { return val = (val << 1 & 0xff) >>> 1; } public static String byteToHexString(byte src) { StringBuilder stringBuilder = new StringBuilder(""); int v = src & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); return stringBuilder.toString(); } /** * Convert byte[] to hex string. 把字节数组转化为字符串 * * @param src * @param begin * byte[] 起始位置 * @param len * 长度 * @return */ public static String bytesToHexString(byte[] src, int begin, int len) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } // 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 int end = begin + len; for (int i = begin; i < end; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } /** * Convert byte[] to hex string. 把字节数组转化为字符串 * * * @param src * byte[] * @return hex string */ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } // 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } /** * 空格分隔 * @param src * @return */ public static String bytesToHexString2(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } // 这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。 for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv).append(" "); } return stringBuilder.toString(); } /** * 字节数组转成16进制表示格式的字符串 * * @param byteArray * 需要转换的字节数组 * @return 16进制表示格式的字符串 **/ public static String toHexString(byte[] byteArray) { if (byteArray == null || byteArray.length < 1) throw new IllegalArgumentException("this byteArray must not be null or empty"); final StringBuilder hexString = new StringBuilder(); for (int i = 0; i < byteArray.length; i++) { if ((byteArray[i] & 0xff) < 0x10)//0~F前面不零 hexString.append("0"); hexString.append(Integer.toHexString(0xFF & byteArray[i])); } return hexString.toString().toLowerCase(); } /** * Convert byte[] to hex string[]. 把字节数组转化为字符串数组 * */ public static String[] bytesToHexStrings(byte[] src) { String s = bytesToHexString(src); String[] ss = new String[src.length]; for (int j = 0; j < ss.length; j++) { ss[j] = s.substring(2 * j, 2 * (j + 1)); } return ss; } /** * Convert hex string to byte[] 把字符串转化为字节数组 * * @param hexString * the hex string, 两位string一个byte, 允许有空格分隔 * @return byte[] */ public static byte[] hexStringToBytes(String hexString) { if (hexString == null || hexString.equals("")) { return null; } hexString = hexString.replaceAll(" ", ""); hexString = hexString.toUpperCase(); int length = hexString.length() / 2; char[] hexChars = hexString.toCharArray(); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } return d; } // ------------ /** * 将 10进制int 转换为占一个字节的hexString * * @param src * @return */ public static String int2HexString(int src) { StringBuilder stringBuilder = new StringBuilder(); String hv = Integer.toHexString(src); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); return stringBuilder.toString(); } /** * 将10进制int转换为占2个字节的hexString(低字节在前) * * @param src * @return */ public static String intToHexString(int src) { byte[] b = ByteUtils.toBytes(src); return ByteUtils.bytesToHexString(b); } /** * 将10进制int转换为占2个字节的hexString(高字节在前) * * @param src * @return */ public static String intToHexStringH(int src) { byte[] b = ByteUtils.toBytesH(src); return ByteUtils.bytesToHexString(b); } /** * 将10进制String 转换为占2个字节的hexString(低位在前) * * @param src * @return */ public static String toHexString(String src) { return intToHexString(Integer.valueOf(src)); } /** * 将10进制int转换为占4个字节的hexString * * @param src * @return */ public static String intTo4HexString(int src) { return ByteUtils.bytesToHexString(ByteUtils.intToBytes(src)); } /** * int -> byte[iArrayLen] * * @param iSource * @param iArrayLen * <=4 * @return */ public static byte[] toByteArray(int iSource, int iArrayLen) { byte[] bLocalArr = new byte[iArrayLen]; for (int i = 0; i < iArrayLen; i++) { // bLocalArr[i] = (byte) (iSource >> 8 * (iArrayLen - i - 1) & // 0xFF); bLocalArr[i] = (byte) (iSource >> 8 * i); } return bLocalArr; } /** * int -> byte[2] * * @param * @return 低位在前 */ public static byte[] toBytes(int v) { byte[] targets = new byte[2]; targets[0] = (byte) (0xff & v); targets[1] = (byte) (0xff & (v >> 8)); return targets; } /** * int -> byte[2] * * @param * @return 高位在前 */ public static byte[] toBytesH(int v) { byte[] targets = new byte[2]; targets[1] = (byte) (0xff & v); targets[0] = (byte) (0xff & (v >> 8)); return targets; } /** * int -> byte[4] * 低位在前 * * @param num * @return */ public static byte[] intToBytes(int num) { byte[] targets = new byte[4]; targets[0] = (byte) (num & 0xff);// 最低位 targets[1] = (byte) ((num >> 8) & 0xff);// 次低位 targets[2] = (byte) ((num >> 16) & 0xff);// 次高位 targets[3] = (byte) (num >>> 24);// 最高位,无符号右移。 return targets; } /** * 低位在前 ,3位的byte[] 转 int * * @return */ public static int toInt3(byte[] bs, int begain) { int accum = 0; accum = bs[begain + 0] & 0xFF; accum |= (bs[begain + 1] & 0xFF) << 8; accum |= (bs[begain + 2] & 0xFF) << 16; return accum; } /** * 低位在前 ,4位的byte 转 int * * @param bs * 低位在前 byte数组 * @return */ public static int toInt4(byte[] bs) { int accum = 0; accum = bs[0] & 0xFF; accum |= (bs[1] & 0xFF) << 8; accum |= (bs[2] & 0xFF) << 16; accum |= (bs[3] & 0xFF) << 24; return accum; } /** * 获取 高位在前的4位byte int值
* * @param bs * 高位在前 byte数组 * @return */ public static int toIntByH(byte[] bs, int start) { int accum = 0; accum = bs[start + 3] & 0xFF; accum |= (bs[start + 2] & 0xFF) << 8; accum |= (bs[start + 1] & 0xFF) << 16; accum |= (bs[start + 0] & 0xFF) << 24; return accum; } /** * 将低位在前 ,4位的byte 转 int * * @param bs * byte数组 * @param pos * 起始位置 * @return */ public static int toInt4(byte[] bs, int pos) { int accum = 0; accum = bs[pos + 0] & 0xFF; accum |= (bs[pos + 1] & 0xFF) << 8; accum |= (bs[pos + 2] & 0xFF) << 16; accum |= (bs[pos + 3] & 0xFF) << 24; return accum; } /** * 低位在前 的 byte[2] 转 int, int*0.01转成double并保留两位小数 * * @param res * @param begainIdx * 起始位置 * @return */ public static double toDouble(byte[] res, int begainIdx) { Double data = toInt2(res, begainIdx) * 0.01; DecimalFormat bd = new DecimalFormat("#.00"); data = Double.valueOf( bd.format(data) ); return data; } /** * 低位在前 的 byte[2] 转 int * * @param res * @param begainIdx * 起始位置 * @return */ public static int toInt2(byte[] res, int begainIdx) { // 一个byte数据左移24位变成0x??000000,再右移8位变成0x00??0000 int targets = (res[begainIdx] & 0xff) | ((res[begainIdx + 1] << 8) & 0xff00); return targets; } /** * byte[] 转 int * * @param res * 低位在前 ,2位的byte数组 * @return */ public static int toInt2(byte[] res) { // 一个byte数据左移24位变成0x??000000,再右移8位变成0x00??0000 int targets = (res[0] & 0xff) | ((res[1] << 8) & 0xff00); // | 表示安位或 return targets; } /** * Convert char to byte * * @param c * char * @return byte */ private static byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } /** * 获取接收到的信息中的指令码 * * @param msg * 接收到的信息 * @return */ public static String getMsgCmd(byte[] msg) { byte[] cmd = { msg[6], msg[7] }; return bytesToHexString(cmd); } /** * 返回命令字符串,如:106 * @param cmdArea * @return * @author 时克英 * @date 2020-08-20 */ public static String getCommand(byte[] cmdArea){ return bytesToHexString(cmdArea); } /** * 将i进制字符串转换成j进制字符串 * * @param str * @param i * @param j */ public static String itoj(String str, int i, int j) { String[] strs = str.split("\\s+"); String result = ""; for (String string : strs) { String hex = Integer.toString(Integer.parseInt(string, i), j); result += hex; } return result; } public static void main(String[] args){ byte[] b = new byte[] { (byte) 0xAA, (byte) 0xf5 }; int i = ByteUtils.toInt2(b); System.out.println("byte[] value = " + i); } }