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; }
问题分析与修正方案
编码代码核心问题
- 字符覆盖而非追加:
res = rev.concat(rev);每次循环会覆盖之前的结果,导致仅保留最后一个字符的二进制串(还重复了一次),需改为追加逻辑。 - 二进制处理逻辑错误:清空
bin数组时用字符总数作为循环上限,应为固定7位;且错误地将二进制串重复拼接,导致编码长度翻倍。 - 数组初始化冗余:超大数组无必要,应匹配输入字符串长度。
解码代码核心问题
- 循环终止条件错误:
for (int i = 0; i < idx; i++)会丢失最后一个字符,需改为i <= idx。 - 权重计算逻辑颠倒:二进制位的权重计算顺序错误,导致ASCII值计算偏差。
- 拼写瑕疵:
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
相关产品推荐
相关产品推荐

