欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BinaryStringConverteUtil: java 字符串与二进制相互转换

程序员文章站 2024-03-18 14:32:46
...

最近在学习redis 的bitmap相关命令时, 用到了字符串和二进制的转换。于是用java 写了一个二进制与字符串相互转换的一个工具类

方法签名 方法描述
public static String toBinaryString(String str) 将普通字符串转换为二进制字符串
public static String toString(String binaryStr) 将二进制字符串转换为普通字符串
public static int countBitOne(String binaryStr) 统计二进制字符串中的1的数量

1. 转换工具类源码

/**
 * 二进制字符串转换工具类
 * @Auth zongf
 * @Date 2019-05-07
 */
public class BinaryStringConverteUtil {

    private static final String BIN_SEPARATOR = " ";


    /**
     * 字符串转换为二进制字符串
     * @param str 普通字符串
     * @return String 二进制字符串
     * @Auth zongf
     * @Date 2019-05-07
     */
    public static String toBinaryString(String str) {

        if (str == null) return null;

        StringBuffer sb = new StringBuffer();

        byte[] bytes = str.getBytes();
        for (byte aByte : bytes) {
            sb.append(Integer.toBinaryString(aByte) + BIN_SEPARATOR);
        }
        return sb.toString();
    }


    /**
     * 二进制字符串转换为普通字符串
     * @param binaryStr 二进制字符串
     * @return String 普通字符串
     * @Auth zongf
     * @Date 2019-05-07
     */
    public static String toString(String binaryStr) {

        if (binaryStr == null) return null;

        String[] binArrays = binaryStr.split(BIN_SEPARATOR);


        StringBuffer sb = new StringBuffer();
        for (String binStr : binArrays) {
            char c = binstrToChar(binStr);
            sb.append(c);
        }
        return sb.toString();
    }

    /**
     * 统计二进制字符串中1的个数
     * @param binaryStr 二进制字符,如:1101
     * @return int
     * @Auth zongf
     * @Date 2019-05-07
     */
    public static int countBitOne(String binaryStr) {
        int cnt = 0;
        if(binaryStr != null) {
            byte[] bytes = binaryStr.getBytes();
            for (byte aByte : bytes) {
                if (aByte==49) {
                    cnt++;
                }
            }
        }
        return cnt;
    }

    /**
     * 二进制字符转换为int数组
     * @param binStr 二进制字符串
     * @return int[]
     * @Auth zongf
     * @Date 2019-05-07
     */
    private static int[] binstrToIntArray(String binStr) {
        char[] temp=binStr.toCharArray();
        int[] result=new int[temp.length];
        for(int i=0;i<temp.length;i++) {
            result[i]=temp[i]-48;
        }
        return result;
    }

    /**
     * 将二进制转换成字符
     * @param binStr 二进制字符串
     * @return char
     * @Auth zongf
     * @Date 2019-05-07
     */
    private static char binstrToChar(String binStr){
        int[] temp=binstrToIntArray(binStr);
        int sum=0;
        for(int i=0; i<temp.length;i++){
            sum +=temp[temp.length-1-i]<<i;
        }
        return (char)sum;
    }

}

2. 测试

2.1 测试用例

@Test
public void test1(){

    String str = "abc";

    // 转换为二进制字符串
    String binaryStr = BinaryStringConverteUtil.toBinaryString(str);

    // 获取1的数量
    int cnt = BinaryStringConverteUtil.countBitOne(binaryStr);

    // 反向转换
    String newStr = BinaryStringConverteUtil.toString(binaryStr);

    System.out.println("源字符串:" + str);
    System.out.println("二进制字符串:" + binaryStr);
    System.out.println("1位数量:" + BinaryStringConverteUtil.countBitOne(binaryStr));
    System.out.println("新字符串:" + newStr);
}

2.2 测试输出

源字符串:abc
二进制字符串:1100001 1100010 1100011
1位数量:10
新字符串:abc