精华内容
下载资源
问答
  • Hex编码

    2019-09-29 21:44:51
    Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后输出这两个...

    编码原理

    Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后输出这两个字节对应十六进制数字作为编码。Hex编码后的长度是源数据的2倍,Hex编码的编码表为

     0 0     1 1     2 2     3 3    
     4 4     5 5     6 6     7 7    
     8 8     9 9    10 a    11 b    
    12 c    13 d    14 e    15 f
    

    比如ASCII码A的Hex编码过程为

    ASCII码:A (65)
    二进制码:0100_0001
    重新分组:0000_0100 0000_0001
    十六进制:        4         1
    Hex编码:41
    
    丁
    e4b881
    

    代码实现

    使用Bouncy Castle的实现

    下面的代码使用开源软件Bouncy Castle实现Hex编解码,使用的版本是1.56。

    import java.io.UnsupportedEncodingException;
    import org.bouncycastle.util.encoders.Hex;
    public class HexTestBC {
        public static void main(String[] args) 
                throws UnsupportedEncodingException {
            // 编码
            byte data[] = "A".getBytes("UTF-8");
            byte[] encodeData = Hex.encode(data);
            String encodeStr = Hex.toHexString(data);
            System.out.println(new String(encodeData, "UTF-8"));
            System.out.println(encodeStr);
            // 解码
            byte[] decodeData = Hex.decode(encodeData);
            byte[] decodeData2 = Hex.decode(encodeStr);
            System.out.println(new String(decodeData, "UTF-8"));
            System.out.println(new String(decodeData2, "UTF-8"));
        }
    }
    

    程序输出

    41
    41
    A
    A
    

    使用Apache Commons Codec实现

    下面的代码使用开源软件Apache Commons Codec实现Hex编解码,使用的版本是1.10。

    import java.io.UnsupportedEncodingException;
    import org.apache.commons.codec.DecoderException;
    import org.apache.commons.codec.binary.Hex;
    public class HexTestCC {
        public static void main(String[] args)
                throws UnsupportedEncodingException,
                    DecoderException {
            // 编码
            byte data[] = "A".getBytes("UTF-8");
            char[] encodeData = Hex.encodeHex(data);
            String encodeStr = Hex.encodeHexString(data);
            System.out.println(new String(encodeData));
            System.out.println(encodeStr);
            // 解码
            byte[] decodeData = Hex.decodeHex(encodeData);
            System.out.println(new String(decodeData, "UTF-8"));
        }
    }
    

    源码分析

    Bouncy Castle实现源码分析

    Bouncy Castle实现Hex编解码的是org.bouncycastle.util.encoders.HexEncoder类,实现编码时首先定义了一个编码表

    protected final byte[] encodingTable =
    {
        (byte)'0', (byte)'1', (byte)'2', (byte)'3', 
        (byte)'4', (byte)'5', (byte)'6', (byte)'7',
        (byte)'8', (byte)'9', (byte)'a', (byte)'b', 
        (byte)'c', (byte)'d', (byte)'e', (byte)'f'
    };
    

    然后编码的代码是

    public int encode(
        byte[]                data,
        int                    off,
        int                    length,
        OutputStream    out) 
        throws IOException
    {        
        for (int i = off; i < (off + length); i++)
        {
            int    v = data[i] & 0xff;
            out.write(encodingTable[(v >>> 4)]);
            out.write(encodingTable[v & 0xf]);
        }
        return length * 2;
    }
    

    解码的实现稍微复杂一点,在HexEncoder的构造方法中会调用initialiseDecodingTable建立解码表,代码如下

    protected final byte[] decodingTable = new byte[128];
    protected void initialiseDecodingTable()
    {
        for (int i = 0; i < decodingTable.length; i++)
        {
            decodingTable[i] = (byte)0xff;
        }
        for (int i = 0; i < encodingTable.length; i++)
        {
            decodingTable[encodingTable[i]] = (byte)i;
        }
        
        decodingTable['A'] = decodingTable['a'];
        decodingTable['B'] = decodingTable['b'];
        decodingTable['C'] = decodingTable['c'];
        decodingTable['D'] = decodingTable['d'];
        decodingTable['E'] = decodingTable['e'];
        decodingTable['F'] = decodingTable['f'];
    }
    
    

    解码表是一个长度是128的字节数组,每个位置代表对应的ASCII码,该位置上的值表示该ASCII码对应的二进制码。具体到Hex的解码表,第48-59个位置,即ASCII码0-9的位置保存了数字0-9,第65-70个位置,即ASCII码A-F的位置保存了数字10-15,第97-102个位置,即ASCII码a-f同样保存了数字10-15。解码表为
    比如array[65] = A

      -1      -1      -1      -1      -1      -1      -1      -1    
      -1      -1      -1      -1      -1      -1      -1      -1    
      -1      -1      -1      -1      -1      -1      -1      -1    
      -1      -1      -1      -1      -1      -1      -1      -1    
      -1    ! -1    " -1    # -1    $ -1    % -1    & -1    ' -1    
    ( -1    ) -1    * -1    + -1    , -1    - -1    . -1    / -1    
    0  0    1  1    2  2    3  3    4  4    5  5    6  6    7  7    
    8  8    9  9    : -1    ; -1    < -1    = -1    > -1    ? -1    
    @ -1    A 10    B 11    C 12    D 13    E 14    F 15    G -1    
    H -1    I -1    J -1    K -1    L -1    M -1    N -1    O -1    
    P -1    Q -1    R -1    S -1    T -1    U -1    V -1    W -1    
    X -1    Y -1    Z -1    [ -1    \ -1    ] -1    ^ -1    _ -1    
    ` -1    a 10    b 11    c 12    d 13    e 14    f 15    g -1    
    h -1    i -1    j -1    k -1    l -1    m -1    n -1    o -1    
    p -1    q -1    r -1    s -1    t -1    u -1    v -1    w -1    
    x -1    y -1    z -1    { -1    | -1    } -1    ~ -1      -1
    

    解码的过程实际上就是获取连续两个字节,取这两个字节解码表中对应的数值,然后将这两个数值拼接成一个8位二进制码,作为解码的输出。源码如下:

    public int decode(
        byte[]          data,
        int             off,
        int             length,
        OutputStream    out)
        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', '1', '2', '3', '4', '5', '6', '7',
         '8', '9', '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方法。

    public static byte[] decodeHex(final char[] data)
               throws DecoderException {
        final int len = data.length;
        if ((len & 0x01) != 0) {
            throw new DecoderException("Odd number of characters.");
        }
        final byte[] out = new byte[len >> 1];
        // two characters form the hex value.
        for (int i = 0, j = 0; j < len; i++) {
            int f = toDigit(data[j], j) << 4;
            j++;
            f = f | toDigit(data[j], j);
            j++;
            out[i] = (byte) (f & 0xFF);
        }
        return out;
    }
    protected static int toDigit(final char ch, final int index)
            throws DecoderException {
        final int digit = Character.digit(ch, 16);
        if (digit == -1) {
            throw new DecoderException(""
                    + "Illegal hexadecimal character "
                    + ch + " at index " + index);
        }
        return digit;
    }
    

    原文地址:https://www.jianshu.com/p/57c4e8d3f035

    转载于:https://www.cnblogs.com/jpfss/p/11010653.html

    展开全文
  • hex 编码

    2017-07-02 00:00:00
    编码的时候如何将byte[]数据以String保存 我了解到的办法是: base64和hex.这次来了解下hex. hex是什么: hex的全称为hexadecimal Strings.也就是16进制字符串. 也就是说hex是通过换算,将原先的byte转换成16进制...

    在编码的时候如何将byte[]数据以String保存

    我了解到的办法是: base64和hex.这次来了解下hex.

    hex是什么:

    1. hex的全称为hexadecimal Strings.也就是16进制字符串.
    2. 也就是说hex是通过换算,将原先的byte转换成16进制字符串.所以hex的源字符串为0~9 和A~F.

    为什么要用hex:

    1. hex提供了简洁的bit描述方法. 使用16进制时,一个byte可以通过00~FF来完全涵括.

    怎么用hex:

    根据apache工具类里(commons-codec-1.9.jar)对Hex的的具体实现.转成hex的思路还是很简单的,对2进制的每4位分别映射到字符表中.

    /**
         * Converts an array of bytes into an array of characters representing the hexadecimal values of each byte in order.
         * The returned array will be double the length of the passed array, as it takes two characters to represent any
         * given byte.
         *
         * @param data
         *            a byte[] to convert to Hex characters
         * @param toDigits
         *            the output alphabet
         * @return A char[] containing hexadecimal characters
         * @since 1.4
         */
        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;
        }

    反转回来的操作如下:

        /**
         * Converts an array of characters representing hexadecimal values into an array of bytes of those same values. The
         * returned array will be half the length of the passed array, as it takes two characters to represent any given
         * byte. An exception is thrown if the passed char array has an odd number of elements.
         *
         * @param data
         *            An array of characters containing hexadecimal digits
         * @return A byte array containing binary data decoded from the supplied char array.
         * @throws DecoderException
         *             Thrown if an odd number or illegal of characters is supplied
         */
        public static byte[] decodeHex(final char[] data) throws DecoderException {
            final int len = data.length;
            if ((len & 0x01) != 0) {
                throw new DecoderException("Odd number of characters.");
            }
            final byte[] out = new byte[len >> 1];
            // two characters form the hex value.
            for (int i = 0, j = 0; j < len; i++) {
                int f = toDigit(data[j], j) << 4;
                j++;
                f = f | toDigit(data[j], j);
                j++;
                out[i] = (byte) (f & 0xFF);
            }
            return out;
        }

    思考

    • 将源数据转换成byte,并用hex编码后长度变化会是这么样:
      如果源数据是UTF-8格式的数据,根据定义:

      128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
      带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
      其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
      其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。

    • 故一个中文,将会被转换成长度为6的字符串来表示.

    三,参考网址

    转载于:https://www.cnblogs.com/alcc/p/9201911.html

    展开全文
  • java hex 编码_1-Hex编码

    2021-02-27 20:56:38
    编码原理Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后...

    编码原理

    Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个字节的低4位是原字节的高四位,另一个字节的低4位是原数据的低4位,高4位都补0,然后输出这两个字节对应十六进制数字作为编码。Hex编码后的长度是源数据的2倍,Hex编码的编码表为

    0 0 1 1 2 2 3 3

    4 4 5 5 6 6 7 7

    8 8 9 9 10 a 11 b

    12 c 13 d 14 e 15 f

    比如ASCII码A的Hex编码过程为

    ASCII码:A (65)

    二进制码:0100_0001

    重新分组:0000_0100 0000_0001

    十六进制: 4 1

    Hex编码:41

    e4b881

    代码实现

    使用Bouncy Castle的实现

    下面的代码使用开源软件Bouncy Castle实现Hex编解码,使用的版本是1.56。

    import java.io.UnsupportedEncodingException;

    import org.bouncycastle.util.encoders.Hex;

    public class HexTestBC {

    public static void main(String[] args)

    throws UnsupportedEncodingException {

    // 编码

    byte data[] = "A".getBytes("UTF-8");

    byte[] encodeData = Hex.encode(data);

    String encodeStr = Hex.toHexString(data);

    System.out.println(new String(encodeData, "UTF-8"));

    System.out.println(encodeStr);

    // 解码

    byte[] decodeData = Hex.decode(encodeData);

    byte[] decodeData2 = Hex.decode(encodeStr);

    System.out.println(new String(decodeData, "UTF-8"));

    System.out.println(new String(decodeData2, "UTF-8"));

    }

    }

    程序输出

    41

    41

    A

    A

    使用Apache Commons Codec实现

    下面的代码使用开源软件Apache Commons Codec实现Hex编解码,使用的版本是1.10。

    import java.io.UnsupportedEncodingException;

    import org.apache.commons.codec.DecoderException;

    import org.apache.commons.codec.binary.Hex;

    public class HexTestCC {

    public static void main(String[] args)

    throws UnsupportedEncodingException,

    DecoderException {

    // 编码

    byte data[] = "A".getBytes("UTF-8");

    char[] encodeData = Hex.encodeHex(data);

    String encodeStr = Hex.encodeHexString(data);

    System.out.println(new String(encodeData));

    System.out.println(encodeStr);

    // 解码

    byte[] decodeData = Hex.decodeHex(encodeData);

    System.out.println(new String(decodeData, "UTF-8"));

    }

    }

    源码分析

    Bouncy Castle实现源码分析

    Bouncy Castle实现Hex编解码的是org.bouncycastle.util.encoders.HexEncoder类,实现编码时首先定义了一个编码表

    protected final byte[] encodingTable =

    {

    (byte)'0', (byte)'1', (byte)'2', (byte)'3',

    (byte)'4', (byte)'5', (byte)'6', (byte)'7',

    (byte)'8', (byte)'9', (byte)'a', (byte)'b',

    (byte)'c', (byte)'d', (byte)'e', (byte)'f'

    };

    然后编码的代码是

    public int encode(

    byte[] data,

    int off,

    int length,

    OutputStream out)

    throws IOException

    {

    for (int i = off; i < (off + length); i++)

    {

    int v = data[i] & 0xff;

    out.write(encodingTable[(v >>> 4)]);

    out.write(encodingTable[v & 0xf]);

    }

    return length * 2;

    }

    解码的实现稍微复杂一点,在HexEncoder的构造方法中会调用initialiseDecodingTable建立解码表,代码如下

    protected final byte[] decodingTable = new byte[128];

    protected void initialiseDecodingTable()

    {

    for (int i = 0; i < decodingTable.length; i++)

    {

    decodingTable[i] = (byte)0xff;

    }

    for (int i = 0; i < encodingTable.length; i++)

    {

    decodingTable[encodingTable[i]] = (byte)i;

    }

    decodingTable['A'] = decodingTable['a'];

    decodingTable['B'] = decodingTable['b'];

    decodingTable['C'] = decodingTable['c'];

    decodingTable['D'] = decodingTable['d'];

    decodingTable['E'] = decodingTable['e'];

    decodingTable['F'] = decodingTable['f'];

    }

    解码表是一个长度是128的字节数组,每个位置代表对应的ASCII码,该位置上的值表示该ASCII码对应的二进制码。具体到Hex的解码表,第48-59个位置,即ASCII码0-9的位置保存了数字0-9,第65-70个位置,即ASCII码A-F的位置保存了数字10-15,第97-102个位置,即ASCII码a-f同样保存了数字10-15。解码表为

    比如array[65] = A

    -1 -1 -1 -1 -1 -1 -1 -1

    -1 -1 -1 -1 -1 -1 -1 -1

    -1 -1 -1 -1 -1 -1 -1 -1

    -1 -1 -1 -1 -1 -1 -1 -1

    -1 ! -1 " -1 # -1 $ -1 % -1 & -1 ' -1

    ( -1 ) -1 * -1 + -1 , -1 - -1 . -1 / -1

    0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7

    8 8 9 9 : -1 ; -1 < -1 = -1 > -1 ? -1

    @ -1 A 10 B 11 C 12 D 13 E 14 F 15 G -1

    H -1 I -1 J -1 K -1 L -1 M -1 N -1 O -1

    P -1 Q -1 R -1 S -1 T -1 U -1 V -1 W -1

    X -1 Y -1 Z -1 [ -1 \ -1 ] -1 ^ -1 _ -1

    ` -1 a 10 b 11 c 12 d 13 e 14 f 15 g -1

    h -1 i -1 j -1 k -1 l -1 m -1 n -1 o -1

    p -1 q -1 r -1 s -1 t -1 u -1 v -1 w -1

    x -1 y -1 z -1 { -1 | -1 } -1 ~ -1 -1

    解码的过程实际上就是获取连续两个字节,取这两个字节解码表中对应的数值,然后将这两个数值拼接成一个8位二进制码,作为解码的输出。源码如下:

    public int decode(

    byte[] data,

    int off,

    int length,

    OutputStream out)

    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', '1', '2', '3', '4', '5', '6', '7',

    '8', '9', '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方法。

    public static byte[] decodeHex(final char[] data)

    throws DecoderException {

    final int len = data.length;

    if ((len & 0x01) != 0) {

    throw new DecoderException("Odd number of characters.");

    }

    final byte[] out = new byte[len >> 1];

    // two characters form the hex value.

    for (int i = 0, j = 0; j < len; i++) {

    int f = toDigit(data[j], j) << 4;

    j++;

    f = f | toDigit(data[j], j);

    j++;

    out[i] = (byte) (f & 0xFF);

    }

    return out;

    }

    protected static int toDigit(final char ch, final int index)

    throws DecoderException {

    final int digit = Character.digit(ch, 16);

    if (digit == -1) {

    throw new DecoderException(""

    + "Illegal hexadecimal character "

    + ch + " at index " + index);

    }

    return digit;

    }

    展开全文
  • HEX编码 URL编码 Unicode编码 ASCII编码 字符的ascii编码可以对照ASCII编码表 中文的ASCII编码是对照unicode编码表 string = input("请输入一个字符: ") print(string+" 的ASCII码为:",ord(string)) #将...

    目录

    ASCII编码

    HEX编码

    URL编码

    Unicode编码

    Base64编码


    ASCII编码

    • 字符的ascii编码可以对照ASCII编码表
    • 中文的ASCII编码是对照unicode编码表
    string = input("请输入一个字符: ")
    print(string+" 的ASCII码为:",ord(string))  		   #将字符转换为ascii码值
    
    number = input("请输入一个ASCII值: ")
    number = int(number)                              #将接收到的字符数字转换int格式
    print(number," 对应的字符是:",chr(number))    #将ascii码值转换为字符

    HEX编码

    hex编码就是16进制编码,是字符的ascii码值的16进制表示

    string = input("请输入一个字符: ")                    #接收一个字符
    number=ord(string)                                   #得到该字符的ASCII值
    print(string+" 的16进制表示为:",hex(number))  		 #将字符的ASCII值转换为16进制形式
    
    string2 = input("请输入16进制表示: ")                 #接收一个16进制格式的ascii值
    number2=int(string2,16)                              #将该16进制的数据转为10进制的数据ascii值
    print(string+" 的16进制表示为:",chr(number2))  	     #将该10进制的ascii转为字符
    

    URL编码

    • 字母不需要进行URL编码
    • 特殊字符的URL编码是其ASCII值的16进制表示,前面加个%
    • 中文的URL编码是其UTF-8编码前面加个 %
    from urllib.parse import quote
    from urllib.parse import unquote
    
    string = input("请输入一个字符: ")
    print(string+" 的URL编码为:",quote(string,"utf-8"))       #将字符进行URL编码
    
    string2 = input("请输入一个URL编码: ")
    print(string2+" 对应的字符为:",unquote(string2,"utf-8"))  #将URL编码转换为字符
    

    Unicode编码

    • 字符的unicode编码是其ascii值前加上 &#   
    • 中文的unicode编码是其hex编码的 0x 换成 \u
    string = input("请输入一个字符: ")
    print(string+" 的unicode编码为:",string.encode('unicode_escape').decode('utf-8'))  		   #将字符转换为ascii码值
    
    print("\u4e2d")           #将unicode编码转为字符,直接打印即可
    

    Base64编码

    import base64
    string = input("请输入一个字符: ")
    print(string+" 的Base64编码为:",base64.b64encode(string.encode('utf-8')).decode("utf-8"))   #字符转为base64编码
    
    string2 = input("请输入一个base64编码: ")
    print(string2+" 对应的字符为:",base64.b64decode(string2.encode('utf-8')).decode("utf-8"))   #base64编码转为字符

    展开全文
  • 1-Hex编码

    2020-01-02 21:59:35
    编码原理 Hex编码就是把一个8位的字节数据用两个十六进制数展示出来,编码时,将8位二进制码重新分组成两个4位的字节,其中一个...Hex编码后的长度是源数据的2倍,Hex编码的编码表为 0 0 1 1 2 2 3 3 4 4 ...
  • 主要介绍了java使用Hex编码解码实现Aes加密解密功能,结合完整实例形式分析了Aes加密解密功能的定义与使用方法,需要的朋友可以参考下
  • Hex编码与解码

    千次阅读 2014-02-26 11:38:37
    一、Hex编码简介 Hex 全称 是Intel HEX。Hex文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制...
  • hex 编码查看

    2018-12-19 15:04:32
    破解版 16 进制查看工具,Android逆向开发 破解版破解
  • 本文实例讲述了java使用Hex编码解码实现Aes加密解密功能。分享给大家供大家参考,具体如下:这里的Aes加密解密方法使用Hex进行了编码解码package com.baidu.wallet.bdwallet.utils;import java.io....
  • 字符串转Hex编码

    2015-06-12 16:11:00
    public static String toHex(String str){ try { byte[] bytes = str.getBytes("GBK"); StringBuilder sb = new StringBuilder(bytes.length * 2); //转换hex编码 ...
  • Hex编码和UTF-8 或者GBK什么的编码 有什么区别不同?SHA1加密后转为字符串为什么需要Hex编码
  • Hex编码 十六进制编码

    千次阅读 2018-07-18 11:06:29
    import java.io.UnsupportedEncodingException;... * HEX字符串与字节码(字符串)转换工具  */ public class HexUtils {  public static void main(String[] args) throws Exception {  ...
  • 网址转换成HEX编码小工具可将普通字符转换成十六进制,使用户更加的直观.查询数据
  • 该存储库包含一个用于处理base32和base32hex编码的Erlang模块。 建造 您可以使用以下方法构建库: make build 测试 您可以使用以下命令执行测试套件: make dialyzer test 您可以使用以下方法生成测试覆盖率: ...
  • 刚开始看ARM指令对应的Hex码的时候会很疑惑,32位的指令为什么会对应四组Hex编码。按照2^4 = 16 来说,一对编码可以描述16位,4对编码可以描述64位才对呀。 实际上Hex编码就是把一个8位的字节数据用两个十六进制数...
  • 本文实例讲述了java使用Hex编码解码实现Aes加密解密功能。分享给大家供大家参考,具体如下:这里的Aes加密解密方法使用Hex进行了编码解码package com.baidu.wallet.bdwallet.utils;import java.io....
  • 二、作用将不可见的,复杂的字节数组数据,转换为可显示的字符串数据类似于Base64编码算法区别:Base64将三个字节转换为四个字符,Hex将三个字节转换为六个字节三、应用场景在XML,JSON等文本中包含不可见数据(二进制...
  • /// 从字符串转换到16进制表示的字符串/// 编码,如"utf-8","gb2312"/// 是否每字符用逗号分隔public static string ToHex(string s, string charset, bool fenge){if ((s.Length % 2) != 0){s += " ";//空格//throw ...
  • Hex编码字节

    2016-07-12 15:41:00
    1、将字节数组转换为字符串 /** * 将字节数组转换为字符串 * 一个字节会形成两个字符,最终长度是原始数据的2倍 ... public static String toHex(byte[] data){ String ret = null; ...
  • public static String bytes2HexString(byte[] b) {StringBuffer result = new StringBuffer();for (int i = 0; i < b.length; i++) {result.append(String.format("%02X", b[i]));}return result.toString();}/*...
  • ASCII码,hex编码,String字符串相互转化及原理ASCII:是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言.我们关心的是数字和字母:48~57为0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122...
  • 浅谈Hex编码算法

    2019-10-07 02:17:34
    类似于Base64编码算法 区别:Base64将三个字节转换为四个字符,Hex将三个字节转换为六个字节 三、应用场景 在XML,JSON等文本中包含不可见数据(二进制数据)时使用 四、使用 1、将字节数组转换为字...
  • java处理Hex编码解码

    千次阅读 2019-08-16 13:52:09
    * @param tochartype hex目标编码 * @return 16进制字符串 * @throws */ public static String string2HexString(String strPart,String tochartype) { try{ return bytes2HexString(strPart.getBytes...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,830
精华内容 732
关键字:

hex编码