好的,所以我有一个Visual Basic 6应用程序,我假设使用Cp1252编码(它们不会更改它,所以我猜这是默认值),它执行以下操作
Java中的等效代码:
String key = "THEKEY";
int x = 1;
int asciiVal, asciiKey, asciiTot;
for(int i = 0; i < frase.length(); i++){
asciiVal = (int)frase.charAt(i);
asciiKey = (int)key.charAt(x-1);
x += x;
if(x > key.length()){
x = 1;
}
asciiTot = asciiVal + asciiKey;
if(asciiTot > 255)
asciiTot -= 255;
resultado = resultado + new String(Character.toChars(asciiTot));
}
frase是正在编码的字符串。现在,我确信这段代码是等效的,因为我已经在VB应用程序中测试了我的结果,它做了同样的事情。
解密方法如下所示:
String key = "THEKEY";
int x = 1;
int asciiVal, asciiKey, asciiTot;
for(int i = 0; i < frase.length(); i++){
asciiVal = (int)frase.charAt(i);
asciiKey = (int)key.charAt(x-1);
x += x;
if(x > key.length()){
x = 1;
}
asciiTot = asciiVal - asciiKey;
if(asciiTot < 0)
asciiTot += 255;
resultado = resultado + new String(Character.toChars(asciiTot));
}
此方法在针对VB6应用程序的测试中也测试为正。
所以现在就是这样,VB应用程序抓取一个String对其进行加密并将其保存在目标列为Modern_Spanish_CI_AS的MSSQL数据库中。所以我假设该字符串经历以下
Cp1252在进入数据库时转换为ISO-8859-1。
我的Java应用程序以UTF-8编码工作,因此我执行了以下操作来检索列
String frase = new String(rs.getString("FoliosTOTALES_Libres").getBytes("Cp1252"), "ISO-8859-1");
然而,解密后的这个字符串的结果并不完全(某些字符未命中)。我已经让Java App给了我一个字符串的ASCII数组,因为我从数据库中收到它,并且有几个ascii值超出255范围(这不应该发生)这就是我责怪编码的原因,但我不知道我知道自己哪里出错了。