翻转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
相关产品推荐
相关产品推荐

