package com.salama.android.util; public class HexUtil { /** * 数值转16进制字符串 * @param val 数值 * @return 16进制字符串 */ public static String toHexString(byte val) { StringBuilder hexStr = new StringBuilder(Integer.toHexString(val)); if(hexStr.length() < 2) { hexStr.insert(0, '0'); } return hexStr.substring(hexStr.length() - 2); } /** * 数值转16进制字符串 * @param val 数值 * @return 16进制字符串 */ public static String toHexString(short val) { StringBuilder hexStr = new StringBuilder(Integer.toHexString(val)); for(int i = hexStr.length(); i < 4; i++) { hexStr.insert(0, '0'); } return hexStr.substring(hexStr.length() - 4); } /** * 数值转16进制字符串 * @param val 数值 * @return 16进制字符串 */ public static String toHexString(int val) { StringBuilder hexStr = new StringBuilder(Integer.toHexString(val)); for(int i = hexStr.length(); i < 8; i++) { hexStr.insert(0, '0'); } return hexStr.toString(); } /** * 数值转16进制字符串 * @param val 数值 * @return 16进制字符串 */ public static String toHexString(long val) { StringBuilder hexStr = new StringBuilder(Long.toHexString(val)); for(int i = hexStr.length(); i < 16; i++) { hexStr.insert(0, '0'); } return hexStr.toString(); } /** * byte数组转16进制字符串 * @param val byte数组 * @return 16进制字符串 */ public static String toHexString(byte[] val) { return toHexString(val, 0, val.length); } /** * byte数组转16进制字符串 * @param val byte数组 * @param offset 偏移 * @param length 长度 * @return 16进制字符串 */ public static String toHexString(byte[] val, int offset, int length) { long lVal = 0; int cnt = length / 8; int startIndex = offset; StringBuilder hexStr = new StringBuilder(); for(int i = 0; i < cnt; i++) { lVal = ((((long)val[startIndex]) << 56) & 0xFF00000000000000L) + ((((long)val[startIndex + 1]) << 48) & 0x00FF000000000000L) + ((((long)val[startIndex + 2]) << 40) & 0x0000FF0000000000L) + ((((long)val[startIndex + 3]) << 32) & 0x000000FF00000000L) + ((((long)val[startIndex + 4]) << 24) & 0x00000000FF000000L) + ((((long)val[startIndex + 5]) << 16) & 0x0000000000FF0000L) + ((((long)val[startIndex + 6]) << 8) & 0x000000000000FF00L) + ((((long)val[startIndex + 7]) ) & 0x00000000000000FFL) ; hexStr.append(toHexString(lVal)); startIndex += 8; } for(; startIndex < length; startIndex++) { hexStr.append(toHexString(val[startIndex])); } return hexStr.toString(); } /** * 16进制字符串转byte数组 * @param hexStr 16进制字符串 * @return */ public static byte[] parseHexString(String hexStr) { int byteLen = hexStr.length() / 2; byte[] buffer = new byte[byteLen]; parseHexString(hexStr, buffer, 0); return buffer; } /** * 16进制字符串转byte数组 * @param hexStr 16进制字符串 * @param destBuff 目标数组 * @param offset 目标数组偏移 */ public static void parseHexString(String hexStr, byte[] destBuff, int offset) { int byteMax = offset + hexStr.length() / 2; int beginIndex = 0; for(int i = offset; i < byteMax; i++) { destBuff[i] = (byte)( hexCharToByte(hexStr.charAt(beginIndex + 1)) | ((hexCharToByte(hexStr.charAt(beginIndex)) << 4) & 0xf0) ); beginIndex += 2; } } /** * 16进制字符转数值 * @param c 16进制字符 * @return 数值 */ public static byte hexCharToByte(char c) { if(c <= '9' && c >= '0') { return (byte)(c - '0'); } else { if(c >= 'a' && c <= 'f') { return (byte)(c - 'a' + 10); } else if(c >= 'A' && c <= 'F') { return (byte)(c - 'A' + 10); } else { return 0; } } } private static long[] BIT_AND_MASK_F_FOR_LONG = new long[]{ 0xFL, 0xF0L, 0xF00L, 0xF000L, 0xF0000L, 0xF00000L, 0xF000000L, 0xF0000000L, 0xF00000000L, 0xF000000000L, 0xF0000000000L, 0xF00000000000L, 0xF000000000000L, 0xF0000000000000L, 0xF00000000000000L, 0xF000000000000000L }; /** * 16进制字符串转数值 * @param hex 16进制字符串 * @return 数值 */ public static long hexToLong(String hex) { int len = hex.length(); long val = 0; char c; int bitOffset = 0; int index = len - 1; for(int i = 0; i < len; i++) { c = hex.charAt(index); val |= ((hexCharToLong(c) << bitOffset) & BIT_AND_MASK_F_FOR_LONG[i]); index --; bitOffset +=4; } return val; } /** * 16进制字符转数值 * @param c 16进制字符 * @return 数值 */ public static long hexCharToLong(char c) { if(c <= '9' && c >= '0') { return (long)(c - '0'); } else { if(c >= 'a' && c <= 'f') { return (long)(c - 'a' + 10); } else if(c >= 'A' && c <= 'F') { return (long)(c - 'A' + 10); } else { return 0; } } } }