加入收藏 | 设为首页 | 会员中心 | 我要投稿 莱芜站长网 (https://www.0634zz.com/)- 云连接、建站、智能边缘云、设备管理、大数据!
当前位置: 首页 > 编程开发 > Java > 正文

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方法。

(编辑:莱芜站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读