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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:45:04