Java实现S-DES时字符串转int数组长度不符合8/10位要求问题
问题原因
- 你的代码调用了
str.split(",")按逗号切割字符串,但用户输入的是无分隔符的连续二进制串(如1011010100),切割后得到的数组只有1个元素,最终生成的Key数组长度自然为1,不符合需求。 - 原循环里打印
Key时直接打印了数组对象,输出的会是对象地址而非数组内容,属于调试输出的小问题。
修复方案
直接遍历二进制字符串的每一位字符,逐位转换为int存入数组即可,同时可增加合法性校验,确保输入是8/10位的纯二进制串,修复后的完整代码如下:
import java.util.*; public class S_DES { public static void main(String[] args) { Scanner input = new Scanner(System.in); // S-DES常量定义保留 int[] IP = { 2, 6, 3, 1, 4, 8, 5, 7 }; int[] IP_Inverse = { 4, 1, 3, 5, 7, 2, 8, 6 }; int[] P10 = { 3, 5, 2, 7, 4, 10, 1, 9, 8, 6 }; int[] P8 = { 6, 3, 7, 4, 8, 5, 10, 9 }; int[] EP = { 4, 1, 2, 3, 2, 3, 4, 1 }; int[] P4 = { 2, 4, 3, 1 }; int[][] S0 = { { 1, 0, 3, 2 }, { 3, 2, 1, 0 }, { 0, 2, 1, 3 }, { 3, 1, 3, 2 } }; int[][] S1 = { { 0, 1, 2, 3 }, { 2, 0, 1, 3 }, { 3, 0, 1, 0 }, { 2, 1, 0, 3 } }; System.out.println("请输入8位或10位二进制密钥: "); String str = input.next(); // 输入合法性校验 if (!str.matches("[01]{8}") && !str.matches("[01]{10}")) { System.out.println("输入不合法,请输入仅包含0/1的8位或10位二进制串"); return; } int size = str.length(); int[] Key = new int[size]; for (int i = 0; i < size; i++) { // 字符'0'的ASCII码为48,减去'0'即可得到对应数字值 Key[i] = str.charAt(i) - '0'; } System.out.println(Arrays.toString(Key) + "\t 您的Key[]数组长度为:" + Key.length); } }
修复后效果
- 用户输入
1011010100,输出的Key数组长度为10,内容为[1, 0, 1, 1, 0, 1, 0, 1, 0, 0] - 用户输入
10101010,输出的Key数组长度为8,内容为[1, 0, 1, 0, 1, 0, 1, 0]
内容的提问来源于stack exchange,提问作者Abhi
相关产品推荐
相关产品推荐

