好的,所以我有一个 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 应用程序抓取一个字符串对其进行加密并将其保存在目标列位于 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 应用程序给了我一个字符串的 ASCII 数组,并且几个 ascii 值超出了 255 范围(这不应该发生),这就是我责怪编码的原因,但我没有不知道我哪里出错了。