import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
/**
 * HEX字符串与字节码(字符串)转换工具
 */
public class HexUtils {
    public static void main(String[] args) throws Exception {
        test("a");//编码前【a】编码后【61】解码后【a】
        test("A");//编码前【A】编码后【41】解码后【A】
        test("1");//编码前【1】编码后【31】解码后【1】
        test("白");//编码前【白】编码后【E799BD】解码后【白】
        test("白乾涛");//编码前【白乾涛】编码后【E799BDE4B9BEE6B69B】解码后【白乾涛】
        System.out.println(URLEncoder.encode("白乾涛", "UTF-8"));//和上述编码结果一致【%E7%99%BD%E4%B9%BE%E6%B6%9B】
        System.out.println(encodeHex("白乾涛".getBytes("UTF-8")));//使用apache的工具类编码和上述编码结果一致【e799bde4b9bee6b69b】
        System.out.println(new String(decodeHex("e799bde4b9bee6b69b".toCharArray()), "UTF-8"));
    }
    private static void test(String input) throws UnsupportedEncodingException {
        String charsetName = "UTF-8";
        System.out.print("编码前【" + input + "】");
        System.out.print("编码后【" + str2HexStr(input, charsetName) + "】");
        System.out.println("解码后【" + hexStr2Str(str2HexStr2(input, charsetName), charsetName) + "】");
    }
    //******************************************************************************************
    //                                                                      参数或返回值为字符串
    //******************************************************************************************
    /**
     * 将原始字符串转换成16进制字符串【方法一】
     */
    public static String str2HexStr(String input, String charsetName) throws UnsupportedEncodingException {
        byte buf[] = input.getBytes(charsetName);
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            //以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
            //如果参数为负,那么无符号整数值为参数加上 2^32;否则等于该参数。将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串。
            //如果无符号数的大小值为零,则用一个零字符 '0' (’\u0030’) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。
            //用以下字符作为十六进制数字【0123456789abcdef】。这些字符的范围是从【'\u0030' 到 '\u0039'】和从【'\u0061' 到 '\u0066'】。
            String hex = Integer.toHexString(buf[i] & 0xFF);//其实核心也就这一样代码
            if (hex.length() == 1) hex = '0' + hex;
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
    /**
     * 将原始字符串转换成16进制字符串【方法二】
     */
    public static String str2HexStr2(String str, String charsetName) throws UnsupportedEncodingException {
        byte[] bs = str.getBytes(charsetName);
        char[] chars = "0123456789ABCDEF".toCharArray();
        StringBuilder sb = new StringBuilder();
        for (int i = 0, bit; i < bs.length; i++) {
            bit = (bs[i] & 0x0f0) >> 4;
            sb.append(chars[bit]);
            bit = bs[i] & 0x0f;
            sb.append(chars[bit]);
        }
        return sb.toString();
    }
    /**
     * 将16进制字符串转换为原始字符串
     */
    public static String hexStr2Str(String hexStr, String charsetName) throws UnsupportedEncodingException {
        if (hexStr.length() < 1) return null;
        byte[] hexbytes = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            hexbytes[i] = (byte) (high * 16 + low);
        }
        return new String(hexbytes, charsetName);
    }
    //******************************************************************************************
    //                                                                      参数或返回值为字节数组
    //******************************************************************************************
    /**
     * 将二进制转换成16进制
     */
    public static String encode(byte buf[]) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            String hex = Integer.toHexString(buf[i] & 0xFF);
            if (hex.length() == 1) hex = '0' + hex;
            sb.append(hex.toUpperCase());
        }
        return sb.toString();
    }
    /**
     * 将16进制转换为二进制(服务端)
     */
    public static byte[] deocde(String hexStr) {
        if (hexStr.length() < 1) return null;
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }
    //******************************************************************************************
    //                          org.apache.commons.codec.binary.Hex的实现方式
    //******************************************************************************************
    private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    public static char[] encodeHex(byte[] data) {
        int l = data.length;
        char[] out = new char[l << 1];
        int i = 0;
        for (int j = 0; i < l; i++) {
            out[(j++)] = DIGITS[((0xF0 & data[i]) >>> 4)];
            out[(j++)] = DIGITS[(0xF & data[i])];
        }
        return out;
    }
    public static byte[] decodeHex(char[] data) throws Exception {
        int len = data.length;
        if ((len & 0x1) != 0) throw new Exception("Odd number of characters.");
        byte[] out = new byte[len >> 1];
        int i = 0;
        for (int j = 0; j < len; i++) {
            int f = toDigit(data[j], j) << 4;
            j++;
            f |= toDigit(data[j], j);
            j++;
            out[i] = ((byte) (f & 0xFF));
        }
        return out;
    }
    private static int toDigit(char ch, int index) throws Exception {
        int digit = Character.digit(ch, 16);
        if (digit == -1) throw new Exception("Illegal hexadecimal charcter " + ch + " at index " + index);
        return digit;
    }

}

Hex编码 十六进制编码的更多相关文章

  1. Day1 字符编码及编码函数

    ord() 函数 获取字符的整数表示chr() 函数 把整数编码转换为对应字符'\十六进制编码\十六进制编码' 可以将字符的整数编码使用十六进制的方式这样写Python字符串类型为str,在内存中以u ...

  2. QT 十六进制字符串转化为十六进制编码

    /*************************************************Function: hexStringtoByteArray()Description: 十六进制字 ...

  3. Java - 将vCard中十六进制编码转换成Unicode

    做课程设计的时候在处理vCard格式的时候遇到过出现十六进制编码的情况,例如 QUOTED-PRINTABLE:=XX=XX=XX=XX=XX`````` 其中XX代表十六进制数,当然,也有可能在末尾 ...

  4. 代码,绘画,设计常用的颜色名称-16进制HEX编码-RGB编码 对照一览表

    排列方式,英文名称的字典序 颜色名 HEX16进制编码 RGB编码 AliceBlue F0F8FF 240,248,255 AntiqueWhite FAEBD7 250,235,215 Aqua ...

  5. dos命令窗口修改编码,CMD编码修改方法

    dos命令窗口修改编码,CMD编码修改方法 第一步,打开命令窗口有两种方法第一种:可以点击左下角的开始按钮,在运行里面输入CMD,然后敲回车2第二种:组合键WIN+R键,组合键后就会弹出窗口,然后输入 ...

  6. javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码

     乱码是一个经常出现的问题 请求中,参数传递的过程中也是经常出现乱码的问题 本文主要整理了请求乱码中的问题以及解决思路   先要理解一个概念前提: 编码就是把图形变成数值码所以说: 图形的字符  -- ...

  7. python 应用 base64、hmac、hashlib包实现:MD5编码 base64编码解码、SHA256编码、urlsafe_b64encode编码等等基本所有的加密签名的方法

    用python做HTTP接口自动化测试的时候,接口的很多参数是经过各种编码加密处理后在传到后台的,这里列举出python实现 应用 base64.hmac.hashlib包实现:md5编码 sha1编 ...

  8. 在上传文件时候 request.setCharset对文件名有效 对普通文本域无效 需要通过手动转换编码方式编码

    在上传文件时候 request.setCharset对文件名有效 对普通文本域无效 需要通过手动转换编码方式编码

  9. Python判断字符串编码以及编码的转换

    转自:http://www.cnblogs.com/zhanhg/p/4392089.html Python判断字符串编码以及编码的转换 判断字符串编码: 使用 chardet 可以很方便的实现字符串 ...

随机推荐

  1. Class.forName()的理解

    转自:http://blog.csdn.net/yanwushu/article/details/7574713 使用jdbc方式连接数据库时会使用一句代码Class.forName(String c ...

  2. 代理Delegate的小应用(代理日期控件和下拉框)

    前言 在平时关于表格一类的的控件使用中,不可避免需要修改每个Item的值,通过在Item中嵌入不同的控件对编辑的内容进行限定,然而在表格的Item中插入的控件始终显示,当表格中item项很多的时候,会 ...

  3. 一步一步自定义SpringMVC参数解析器

    随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...

  4. bzoj3437

    练一下斜率优化 ..] of int64; q,a,b:..] of longint; i,n,h,t,j:longint; function g(j,k:longint):double; var a ...

  5. Azure SQL 数据库的灵活缩放预览版简介

    Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...

  6. 成为Web开发人员的7个简单步骤

    你想成为一名 Web 开发人员,但现在你面前有这样一个问题,那就是你没有在高科技行业工作的经验.你上了一些课程,也花了时间在个人编码项目上,但是你的简历上关于“经验”的部分仍然不为企业承认.过渡到一个 ...

  7. Performance testing of web application

    Testing the performance of web application is easy . It's easy to design unrealistic scenario . Easy ...

  8. Java第一次写的流布局图形界面,留个纪念

    package jisuanqi; import java.awt.*; public class MyFrame extends Frame{ //继承Frame类 public MyFrame() ...

  9. reloadData should be in main thread

    reloadData should be called in main thread, so if you call it in work thread, you should call it as ...

  10. Python - 字典(dict) 详解 及 代码

    字典(dict) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17291329 字典(dict)是表示映射的数据 ...