You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

翻转64位二进制串第0位转字节数组得9字节报错原因求解

问题原因分析

核心问题出在binaryToByte方法中BigInteger的toByteArray()的特性上:
BigInteger的toByteArray()返回的是带符号补码格式的字节数组,遵循两个规则:

  • 当二进制串对应的正整数最高位为0时,返回的字节数组长度刚好匹配二进制位数对应的字节数,不会额外添加内容
  • 当二进制串对应的正整数最高位为1时,为了避免补码被识别为负数,会自动在数组最开头补1个0x00的符号位字节

对应你的场景:

  • 翻转前的BF二进制串最高位(第0位)为0,64位刚好对应8字节,转换后字节数组长度为8,符合DES输入要求
  • 翻转第0位后AF的最高位变成1,toByteArray()自动补1个前导0,总长度变成9字节,因此抛出IllegalBlockSizeException(DES要求输入必须是8字节的倍数),你输出的分段结果第一个值0就是额外补上的符号位字节。
解决方案

替换binaryToByte方法的实现,手动按每8位一组转换二进制串,避免自动补位:

public static byte[] binaryToByte(String s1) {
    // 校验输入长度为64位,刚好对应8字节
    if (s1.length() != 64) {
        throw new IllegalArgumentException("二进制串长度必须为64位");
    }
    byte[] result = new byte[8];
    for (int i = 0; i < 8; i++) {
        int startIndex = i * 8;
        String singleByteStr = s1.substring(startIndex, startIndex + 8);
        result[i] = (byte) Integer.parseInt(singleByteStr, 2);
    }
    return result;
}

修改后转换得到的字节数组长度固定为8,即可正常传入DES加密。

内容的提问来源于stack exchange,提问作者user14370029

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:36:02