十进制字符串转换为多种进制(压缩字符串)

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;

/**
 * 
 * <一句话功能简述> 数组转换
 * <功能详细描述> 1、16进制转2进制(位)数组
 *             2、2进制(位)数组转16进制
 *             3、10进制转换52(纯字母)进制
 *             4、52(纯字母)进制换10进制转
 *             5、10进制转换26(纯小写字母)进制
 *             6、26(纯小写字母)进制换10进制转
 *             7、10进制转换62(字母数字)进制
 *             8、62(字母数字)进制换10进制转
 * 
 * @author  user
 * @version  [版本号, 2019年4月10日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class TransOfNumber 
{
	private static final Logger logger = LoggerFactory.getLogger(TransOfNumber.class);

	/**
	 * 数字转换周期  26个小写字母
	 */
	public static final int TRANSFER_CYCLE_LOWERCASE = 26;
	/**
	 * 数字转换周期  52个大、小写字母
	 */
	public static final int TRANSFER_CYCLE_ALLCASE = 52;
	/**
	 * 数字转换周期  62个大、小写字母和数字
	 */
	public static final int TRANSFER_CYCLE_NUMBER_LETTERS = 62;
	/**
	 * 数字转换周期  76个大、小写字母、数字和字符
	 */
	public static final int TRANSFER_CYCLE_NUMBER_LETTER_SYMBOLS = 76;
	/**
	 * <一句话功能简述>16进制转2进制(位)数组
	 * <功能详细描述>
	 * author: user
	 * 创建时间:  2019年4月10日
	 * @param data
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	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;
	}
	
	/**
	 * <一句话功能简述>2进制(位)数组转16进制
	 * <功能详细描述>
	 * author: user
	 * 创建时间:  2019年4月10日
	 * @param src
	 * @return
	 * @see [类、类#方法、类#成员]
	 */
	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);
	}
	
    /**
     * <一句话功能简述> 十进制(dec)字符串转换成XX进制system(小写字母)字符串
     * <功能详细描述>
     * author: user
     * 创建时间:  2019年4月10日
     * @param decStr 十进制数字字符串  
     * @param system 要转换的进制( 26、小写字母, 52、大小写字母 , 62、大小写字母数字 , 76、 大小写字母数字字符)
     */
    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();
    }
    
    /**
     * <一句话功能简述> 十进制(dec)长整型数 转换成XX进制system(小写字母)字符串
     * <功能详细描述>
     * author: user
     * 创建时间:  2019年4月10日
     * @param decimal 十进制数
     *         system 要转换的进制( 26、小写字母, 52、大小写字母 , 62、大小写字母数字 , 76、 大小写字母数字字符)
     * @return
     * @see [类、类#方法、类#成员]
     */
    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();
    }

    
    /**
     * <一句话功能简述> XX进制转换10进制字符串
     * <功能详细描述>
     * author: user
     * 创建时间:  2019年4月10日
     * @param bigSys 其他进制字符串
     *        system 传入字符的进制进制( 26、小写字母, 52、大小写字母 , 62、大小写字母数字 , 76、 大小写字母数字字符)
     * @return
     * @see [类、类#方法、类#成员]
     */
    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);
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值