当前位置: 代码迷 >> J2SE >> 小白问:字符串编码出错,如何解决
  详细解决方案

小白问:字符串编码出错,如何解决

热度:44   发布时间:2016-04-23 20:06:13.0
小白问:字符串编码出错,怎么解决?
  现在我思路完全被弄昏了,请允许我半夜晕头的情况下来提问,本人因计算机网络题目的需求,说有一串密文,用的是移位密码加密的。就是凯撒的替代密码。对每个字符,按照一定的移动个数,依次移动加密而成的密文。
  现在要你解出明文。我写的解密算法,从感觉上来说,是没有错的,但是无论在控制台还是读取本地文件,出来都是一串乱码,怎么都解决不了。所以,还无法验证算法的正确性。
  
import java.io.*;

public class Encryption {
InputStream is = null;
OutputStream os = null;

public Encryption(InputStream is, OutputStream os) {
this.is = is;
this.os = os;
}

public void fileOpare(int key) {
byte[] buf = new byte[1024];
String source = null;
String destion = null;

try {
is.read(buf);
source = new String(buf);
destion = encryption(source, key);
os.write(destion.getBytes());
os.flush();
} catch (IOException e) {
System.out.println(e.getMessage());
} finally {
try{
is.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
try{
os.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}

public static String encryption(String source, int key) {
String buf = "";
for(int i = 0; i < source.length(); i++) {
int c = source.charAt(i);
if(Character.isLowerCase(c)) {
c = (char)(c - 97 + key);
} else if(Character.isUpperCase(c)) {
c = (char)(c - 65 + key);
}
buf = buf + c;
}
return buf;
}
}


测试文件
import java.io.*;

public class Test {

public static void main(String[] args) throws UnsupportedEncodingException, IOException {
InputStream is = new FileInputStream("E:/program/input.txt");
OutputStream os = new FileOutputStream("E:/program/output.txt");
Encryption d = new Encryption(is, os);
d.fileOpare(1);
}
}

------解决思路----------------------
把txt文本用记事本打开,然后另存为,选utf-8编码试试
------解决思路----------------------
你这里只有解密吗? 自己搞一个加密,然后解自己的。 

可能数据源就是错的,解自己的,比较好验证。
------解决思路----------------------
引用:
你这里只有解密吗? 自己搞一个加密,然后解自己的。 

可能数据源就是错的,解自己的,比较好验证。


不对不对。
if(Character.isLowerCase(c)) {
                c = (char)(c - 97 + key);
            } else if(Character.isUpperCase(c)) {
                c = (char)(c - 65 + key);
            }
c 是小写字母,然后 c = key。 key一般是移位数吧? 这样C就不是字母了。

------解决思路----------------------
你用 字符流读读 看 
------解决思路----------------------
楼主这样试试(就是加个取余操作):

c = (char)(97 + (c - 97 + key)%26);
  相关解决方案