Hex编码一
发布时间:2023-02-20 10:58:46 所属栏目:Java 来源:互联网
导读:Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后输出这两个字节对应十六进制数字作为编码。Hex编码后
throws IOException { byte b1,b2; int outLen = 0; int end = off + length; while (end > off) { if (!ignore((char)data[end - 1])) { break; } end--; } int i = off; while (i < end) { while (i < end && ignore((char)data[i])) { i++; } b1 = decodingTable[data[i++]]; while (i < end && ignore((char)data[i])) { i++; } b2 = decodingTable[data[i++]]; if ((b1 | b2) < 0) { throw new IOException("invalid characters encountered in Hex data"); } out.write((b1 << 4) | b2); outLen++; } return outLen; } 其中ignore方法的代码如下,解码时会忽略首、尾及中间的空白。 private static boolean ignore( char c) { return c == 'n' || c =='r' || c == 't' || c == ' '; } 示例代码中的Hex工具类持有HexEncoder的实例,并通过ByteArrayOutputStream类实现对byte数组的操作,此外不再赘述。 public class Hex { private static final Encoder encoder = new HexEncoder(); public static byte[] encode( byte[] data,int off,int length) { ByteArrayOutputStream bOut = new ByteArrayOutputStream(); try { encoder.encode(data,off,length,bOut); } catch (Exception e) { throw new EncoderException("exception encoding Hex string: " + e.getMessage(),e); } return bOut.toByteArray(); } ...... } Apache Commons Codec实现源码分析 Apache Commons Codec实现Hex编码的步骤是直接创建一个两倍源数据长度的字符数组,然后分别将源数据的每个字节转换成两个字节放到目标字节数组中,Apache Commons Codec支持设置的要转换为大写还是小写。 private static final char[] DIGITS_LOWER = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; private static final char[] DIGITS_UPPER = {'0','A','B','C','D','E','F'}; public static char[] encodeHex(final byte[] data) { return encodeHex(data,true); } public static char[] encodeHex(final byte[] data,final boolean toLowerCase) { return encodeHex(data,toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); } protected static char[] encodeHex(final byte[] data,final char[] toDigits) { final int l = data.length; final char[] out = new char[l << 1]; // two characters form the hex value. for (int i = 0,j = 0; i < l; i++) { out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; out[j++] = toDigits[0x0F & data[i]]; } return out; } Apache Commons Codec实现Hex解码的步骤是首先创建一个原字符串一半长度的字节数组,然后依次将两个连续的十六进制数转换为一个字节数据,转换时使用了JDK的Character.digit方法。 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |