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

Java文本与二进制互转编码解码异常:仅能解码最后一个字符

文本与二进制互转代码修正需求

尝试实现文本与二进制的相互转换,但当前编码生成的二进制位存在异常,解码时仅能得到原文本的最后一个字符。测试输入“hi”时,编码输出为1111111111010011101001,但解码仅返回“i”。以下是原始编码和解码代码:

原始编码代码

public static String enc(String s) {
    ///first layer of encoding
    String initializer="11111111";
    int ct=0;
    int a[]=new int[11111111];
    for (int i = 0; i <s.length(); i++){
        a[i]=(int)s.charAt(i);//charAAT retrun value in geven index
        ct++;
    }

    String res ="";
    int bin[] =new int[111];
    int idx=0;
    for(int i1=0; i1 < ct; i1++) {
        int temp =a[i1];
        for(int j = 0; j < ct; j++) bin[j]=0;
        idx = 0;

        while(temp>0) {
              bin[idx++]=temp%2;
              temp = temp/2;
        }
        String dig = "";
        String temps;
        for (int j = 0; j < 7; j++) {
             temps = Integer.toString(bin[j]);
             dig = dig.concat(temps);
        }
        String rev = "";
        for (int j =dig.length()-1; j>= 0; j--) {
             char ca = dig.charAt(j);
             rev = rev.concat(String.valueOf(ca));
        }
        res = rev.concat(rev);
    }
    res = initializer.concat(res);
    return res;
}

原始解码代码

public static String dec(String res) {
    String invalid = "Invalid Code";
    String initailizer = "11111111";
    Boolean flag = true;

    // 检查初始化串
    for (int i = 0; i < 8; i++) {
        if (initailizer.charAt(i) != res.charAt(i)) {
            flag = false;
            break;
        }
    }
    String data = "";
    for (int i = 8; i < res.length(); i++) {
        char temp = res.charAt(i);
        data = data.concat(String.valueOf(temp));
    }
    int asc[][] = new int[11101][8];
    int idx = -1;
    int idx2 = 0;
    for (int i = 0; i < data.length(); i++) {
        if (i%7==0) {
            idx++;
            idx2 =0;
            char temp = data.charAt(i);
            asc[idx][idx2] = temp-'0';
            idx2++;
        } else {
             char temp = data.charAt(i);
             asc[idx][idx2] = temp -'0';
             idx2++;
        }
    }

    int num[] = new int[11111];
    int nidx = 0;
    int temp = 0;
    int ct = 0;
    for (int i = 0; i < idx; i++) {
        ct = 0;
        temp = 0;
        for (int j=6; j>=0;j--) {
            int temp1 = (int) Math.pow(2, ct);
            temp += (asc[i][j]*temp1);
            ct++;
        }
        num[nidx++] = temp;
    }
    String rv = "";
    char ch;
    for (int i =0; i<nidx; i++) {
        ch = (char) num[i];
        rv = rv.concat(String.valueOf(ch));
    }
    if (data.length()%7 == 0 && flag == true) {
        //return rv;
    }
    return rv;
}

问题分析与修正方案

编码代码核心问题

  1. 字符覆盖而非追加:res = rev.concat(rev); 每次循环会覆盖之前的结果,导致仅保留最后一个字符的二进制串(还重复了一次),需改为追加逻辑。
  2. 二进制处理逻辑错误:清空bin数组时用字符总数作为循环上限,应为固定7位;且错误地将二进制串重复拼接,导致编码长度翻倍。
  3. 数组初始化冗余:超大数组无必要,应匹配输入字符串长度。

解码代码核心问题

  1. 循环终止条件错误:for (int i = 0; i < idx; i++) 会丢失最后一个字符,需改为i <= idx。
  2. 权重计算逻辑颠倒:二进制位的权重计算顺序错误,导致ASCII值计算偏差。
  3. 拼写瑕疵:initailizer应为initializer,虽不影响功能但需修正。

修正后的完整代码

修正后的编码代码

public static String enc(String s) {
    String initializer = "11111111";
    StringBuilder res = new StringBuilder();
    int[] bin = new int[7]; // 固定7位存储二进制

    for (char c : s.toCharArray()) {
        int temp = (int) c;
        // 清空二进制数组
        for (int j = 0; j < 7; j++) {
            bin[j] = 0;
        }
        int idx = 0;
        // 转换为二进制(低位存到数组前几位)
        while (temp > 0 && idx < 7) {
            bin[idx++] = temp % 2;
            temp /= 2;
        }
        // 拼接成正确的7位二进制字符串(高位在前)
        StringBuilder dig = new StringBuilder();
        for (int j = 6; j >= 0; j--) {
            dig.append(bin[j]);
        }
        res.append(dig);
    }
    // 加上初始化串后返回
    return initializer + res.toString();
}

修正后的解码代码

public static String dec(String res) {
    String invalid = "Invalid Code";
    String initializer = "11111111";
    boolean flag = true;

    // 检查初始化串是否匹配
    if (res.length() < 8) {
        return invalid;
    }
    for (int i = 0; i < 8; i++) {
        if (initializer.charAt(i) != res.charAt(i)) {
            flag = false;
            break;
        }
    }
    if (!flag) {
        return invalid;
    }

    String data = res.substring(8);
    // 检查数据长度是否为7的倍数
    if (data.length() % 7 != 0) {
        return invalid;
    }

    StringBuilder rv = new StringBuilder();
    // 每7位分割为一个字符的二进制
    for (int i = 0; i < data.length(); i += 7) {
        String binStr = data.substring(i, i + 7);
        int ascii = 0;
        // 计算ASCII值
        for (int j = 0; j < 7; j++) {
            if (binStr.charAt(j) == '1') {
                ascii += Math.pow(2, 6 - j);
            }
        }
        rv.append((char) ascii);
    }
    return rv.toString();
}

测试验证

输入“hi”时,修正后的编码输出为1111111111010001101001,解码后正确返回“hi”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:45:44