• java byte数组与二进制互相转换


    1.情景展示

    在java当中,如何将二进制转换成byte[]?

    如何将byte[]转换成二进制?

    2.具体分析

    bit:位/比特,缩写:b,只能用0或1表示,也就是二进制,每个0或1就是1bit
    byte:字节,缩写:B 1byte=8bits,能够存储的数据范围是-128~+127。
    1个字母=1个字节=8bit(8位)
    1个数字=1个字节=8bit(8位)
    1个汉字=2个字节=16bit(16位)(使用UTF-8字符集,1个汉字=3个字节=24bit)
    1 Byte = 8 Bits
    1 KB = 1024 Bytes
    1 MB = 1024 KB
    1 GB = 1024 MB

    3.解决方案

    二进制转byte数组

    /*
     * bit转byte
     * @description: 比特转字节
     * @date: 2022/4/1 10:51
     * @param: bitStr 只能是4位比特或8位比特
     * @return: byte 1个字节
     */
    public static byte toByte(String bitStr) {
        if (StringUtils.isEmpty(bitStr)) return 0;
        int re, len;
    
        len = bitStr.length();
    
        if (len != 4 && len != 8) return 0;
    
        if (len == 8) {// 8 bits处理
            if (bitStr.charAt(0) == '0') {// 正数
                re = Integer.parseInt(bitStr, 2);
            } else {// 负数
                re = Integer.parseInt(bitStr, 2) - 256;
            }
        } else {//4 bits处理
            re = Integer.parseInt(bitStr, 2);
        }
    
        return (byte) re;
    }
    
    /*
     * bit转byte数组
     * @description: 
     * @date: 2022/4/6 10:46
     * @param: bitStr 二进制字符串
     * @return: byte[] 字节数组
     */
    @Nullable
    public static byte[] toBytes(String bitStr) {
        if (StringUtils.isEmpty(bitStr)) return null;
    
        int len = bitStr.length();
    
        if (len % 4 != 0) return null;
    
        // 当二进制位数不是8位的整数倍时,取整+1;否则,取整
        byte[] bytes = new byte[(int)(Math.ceil(len / 8))];
    
        int j = 0, k = 0;
        for (int i = 0; i < len; i += 8) {
            j += 8;
            if (j > len) j = len;
    
            bytes[k] = toByte(bitStr.substring(i,j));
            k++;
        }
    
        log.debug("二进制转byte数组:\n{}", ByteUtils.toString(bytes));
        log.debug("二进制长度:{},字节大小:{},比特÷字节={}", bitStr.length(), bytes.length, bitStr.length() / bytes.length);
        return bytes;
    }

    byte数组转二进制

    /*
     * byte转bit
     * @description: 字节转比特
     * 1Byte=8bits
     * @date: 2022/4/1 10:43
     * @param: b 字节
     * @return: java.lang.String 二进制字符串(8位0和1)
     */
    @NotNull
    @Contract(pure = true)
    public static String fromByte(byte b) {
    
        return "" + (byte) ((b >> 7) & 0x1) +
                (byte) ((b >> 6) & 0x1) +
                (byte) ((b >> 5) & 0x1) +
                (byte) ((b >> 4) & 0x1) +
                (byte) ((b >> 3) & 0x1) +
                (byte) ((b >> 2) & 0x1) +
                (byte) ((b >> 1) & 0x1) +
                (byte) ((b) & 0x1);
    }
    
    /*
     * byte[]转bits
     * @description: 字节数组转比特字符串
     * @date: 2022/4/1 11:04
     * @param: bytes 字节数组
     * @return: java.lang.String 比特字符串
     * 1byte=8bit
     */
    @NotNull
    public static String fromBytes(byte[] bytes) {
        if (ByteUtils.isEmpty(bytes)) return "";
    
        StringBuilder sb = new StringBuilder();
        ByteUtils.toList(bytes).forEach(b -> sb.append(fromByte(b)));
    
        log.debug("字节数组转二进制:\n{}", sb);
        log.debug("二进制长度:{},字节大小:{},比特÷字节={}", sb.toString().length(), bytes.length, sb.toString().length() / bytes.length);
        return sb.toString();
    }

    测试

    fromBytes(toBytes("1000000110101110"));

     

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    为什么用户具有Full Controls权限,但还是不能创建页面
    采用Visual Studio 2008 开发工作流模板(三)
    采用Visual Studio 2008 开发工作流模板(五)
    简单学习SPNavigationNodeCollection
    SharePoint Designer工作流的扩展
    SmartQuery_v1.0下载
    如何使用SmartQueryWebPart
    c#生成日程表并实现根据差值获得日期
    Web开发常出现的错误[个人收集]
    System.Net.Mail 发送邮件示例
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/16105424.html
Copyright © 2020-2023  润新知