com.siashan.toolkit.crypt.digest.B64 Maven / Gradle / Ivy
package com.siashan.toolkit.crypt.digest;
import java.security.SecureRandom;
import java.util.Random;
/**
* 将二进制字节转换为ASCII字符的Base64类方法。
*
* @author siashan
* @since 1.0.7
*/
class B64 {
/**
* 带有Base64转换字符的表。
*/
static final String B64T_STRING = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
/**
* 带有Base64转换字符的表。
*/
static final char[] B64T_ARRAY = B64T_STRING.toCharArray();
/**
* 类似Base64的字节到ASCII字符的转换。
*
* @param b2
* 结果中的一个字节。
* @param b1
* 结果中的一个字节。
* @param b0
* 结果中的一个字节。
* @param outLen
* 预期输出字符数。
* @param buffer
* 其中输出字符被附加到。
*/
static void b64from24bit(final byte b2, final byte b1, final byte b0, final int outLen,
final StringBuilder buffer) {
// The bit masking is necessary because the JVM byte type is signed!
int w = ((b2 << 16) & 0x00ffffff) | ((b1 << 8) & 0x00ffff) | (b0 & 0xff);
// It's effectively a "for" loop but kept to resemble the original C code.
int n = outLen;
while (n-- > 0) {
buffer.append(B64T_ARRAY[w & 0x3f]);
w >>= 6;
}
}
/**
* 从B64T集合生成一个随机字符字符串。
*
* @param num 要生成的字符数。
* @return 一个随机的salt {@link String}.
*/
static String getRandomSalt(final int num) {
return getRandomSalt(num, new SecureRandom());
}
/**
* 从B64T集合生成一个随机字符字符串。
*
* @param num 要生成的字符数.
* @param random Random实例 {@link Random}.
* @return 一个随机的salt {@link String}.
*/
static String getRandomSalt(final int num, final Random random) {
final StringBuilder saltString = new StringBuilder(num);
for (int i = 1; i <= num; i++) {
saltString.append(B64T_STRING.charAt(random.nextInt(B64T_STRING.length())));
}
return saltString.toString();
}
}