为什么需要八进制和十六进制?
编程中,我们常用的还是10进制。
比如:
int a = 100;
实际用二进制处理,但二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:
0000 0000 0000 0000 0110 0100
面对这么长的数进行思考或操作,没有人会喜欢。因此,
用8进制或16进制可以解决这个问题。进制越大,数的表达长度也就越短 。
1.String 到 byte[] 的转换很简单,因为String类有直接的函数
2. byte[] 到String不能使用 new String(byte) 或 new String(byte, charset)
因为加密的过程是任意对byte[]进行运算的。所以你用任何一种编码方案来解码,得到的都会是乱码。
/** * Constructs a new {@code String} by decoding the specified array of bytes * using the platform's default charset. The length of the new {@code * String} is a function of the charset, and hence may not be equal to the * length of the byte array. * * <p> The behavior of this constructor when the given bytes are not valid * in the default charset is unspecified. The {@link * java.nio.charset.CharsetDecoder} class should be used when more control * over the decoding process is required.*/ public String(byte bytes[]) { this(bytes, 0, bytes.length); }
一、为什么要将加密得到的 byte[] 转换到 String ?
二、如何实现byte[] 转换到 String
public class HexUtil { private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static String encodeToString(byte[] bytes) { char[] encodedChars = encode(bytes); return new String(encodedChars); } public static char[] encode(byte[] data) { int size = data.length; //初始化一个 char[] 数组,其数组的大小是 byte[] 参数大小的两倍。因为java是char是16位,byte是8位 char[] res = new char[size << 1]; for (int i = 0, j = 0; i < size; i++) { System.out.println(data[i] + "十六进制:" + ((0xF0 & data[i]) >>> 4) + " " + (0x0F & data[i])); //去除了低4位上的值(其实这一步是多余的),然后右移4位,得到高4位 res[j++] = DIGITS[(0xF0 & data[i]) >>> 4]; //去除了高4位上的值,得到了低4位 res[j++] = DIGITS[0x0F & data[i]]; } return res; } public static void main(String[] args){ System.out.println( encodeToString("127".getBytes())); System.out.println( encodeToString("a".getBytes())); System.out.println( encodeToString("你好".getBytes())); } }
/** 49十六进制:3 1 50十六进制:3 2 55十六进制:3 7 313237 97十六进制:6 1 61 -28十六进制:14 4 -67十六进制:11 13 -96十六进制:10 0 -27十六进制:14 5 -91十六进制:10 5 -67十六进制:11 13 e4bda0e5a5bd **/