package com.ybjdw.base.utils;
import java.math.BigDecimal;
import com.ybjdw.base.constant.SysStaticConstData;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TransOfNumber
{
private static final Logger logger = LoggerFactory.getLogger(TransOfNumber.class);
public static final int TRANSFER_CYCLE_LOWERCASE = 26;
public static final int TRANSFER_CYCLE_ALLCASE = 52;
public static final int TRANSFER_CYCLE_NUMBER_LETTERS = 62;
public static final int TRANSFER_CYCLE_NUMBER_LETTER_SYMBOLS = 76;
public static byte[] hexStringToByteArray(String data) {
int k = 0;
if (data == null || data.length() < 1)
{
return null;
}
byte[] results = new byte[data.length() / 2];
for (int i = 0; i < data.length();) {
results[k] = (byte) (Character.digit(data.charAt(i++), 16) << 4);
results[k] += (byte) (Character.digit(data.charAt(i++), 16));
k++;
}
return results;
}
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
public static BigDecimal decimalRoundUp2(BigDecimal decimal)
{
return decimal.setScale(2, BigDecimal.ROUND_UP);
}
public static String decToBigSys(String decStr, int system) {
if (StringUtils.isBlank(decStr)) {
return null;
}
// 如果长整形能处理,尽量不用BigDecimal
if (decStr.length() < 19) {
return decToBigSys(Long.parseLong(decStr), system);
}
BigDecimal bigDecimal = new BigDecimal(decStr);
String str = getbaseStr(system);
int scale = str.length(); //转化目标进制
StringBuilder s = new StringBuilder();
if(bigDecimal.compareTo(new BigDecimal(0)) == 0)
{
return str.charAt(0)+"";
}
bigDecimal = bigDecimal.abs();
while(bigDecimal.compareTo(new BigDecimal(0)) > 0){
if(bigDecimal.compareTo(new BigDecimal(scale)) < 0){
int index = bigDecimal.intValue();
s.insert(0, str.charAt(index));
bigDecimal = new BigDecimal(0);
}else{
BigDecimal [] results = bigDecimal.divideAndRemainder(new BigDecimal(scale));
s.insert(0, str.charAt(results[1].intValue()));
bigDecimal = results[0];
}
}
return s.toString();
}
public static String decToBigSys(long decimal, int system) {
String str = getbaseStr(system);
int scale = str.length(); //转化目标进制
StringBuilder s = new StringBuilder();
if(decimal == 0)
{
return str.charAt(0) + "";
}
while(decimal > 0){
if(decimal < scale){
int index = (int) decimal;
s.insert(0, str.charAt(index));
decimal = 0;
}else{
int r = (int) (decimal % scale);
s.insert(0, str.charAt(r));
decimal = (decimal - r) / scale;
}
}
return s.toString();
}
public static String bigSysToDec(String bigSys, int system)
{
String str = getbaseStr(system);
int scale = str.length(); //转化目标进制
BigDecimal decimal = new BigDecimal(0);
char[] dataChars = bigSys.toCharArray();
for (int i = 0; i < dataChars.length; i++)
{
long num = StringUtils.indexOf(str, dataChars[i]);
if (i == 0 && dataChars[i] == '0')
{
continue;
}
decimal = decimal.add(new BigDecimal(num).multiply(new BigDecimal(scale).pow(dataChars.length - i - 1)));
}
return decimal.toString();
}
public static long bigSysToLongDec(String bigSys, int system)
{
if (StringUtils.isBlank(bigSys)) {
return 0;
}
String decStr = bigSysToDec(bigSys, system);
if (decStr != null && decStr.length() < 19) {
return Long.parseLong(decStr);
} else {
return -1;
}
}
private static String getbaseStr(int system)
{
switch(system) {
case 26:
return "abcdefghijklnmopqrstuvwxyz";
case 52:
return "ABCDEFGHIJKLNMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
case 62:
return "ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
case 76:
return "ABCDEFGHIJKLNMOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+-=";
default :
return "abcdefghijklnmopqrstuvwxyz";
}
}
public static String getUserIdByCode(String userCode){
try{
String recommendUserId = TransOfNumber.bigSysToDec(userCode, 62);
for (int i = recommendUserId.length(); i < SysStaticConstData.SQL_ID_LENGTH; i++) {
recommendUserId = "0" + recommendUserId;
}
return recommendUserId;
}catch (Exception e){
logger.error("通过code获取userId失败!", e);
}
return null;
}
public static void main(String[] args)
{
String numStr = "100001016282207063650000";
// 10进制字符串转换为62进制,压缩
String productCry = decToBigSys(numStr, 62);
System.out.println(productCry);
// 62进制转变回10进制
System.out.println(bigSysToDec(productCry, 62));
System.out.println(numStr);
}
}