我有一个MS-Access数据库,里面有加密的字符串。这些看起来是这样的: Jackcess:MSAccess数据库的错误字符集
但是,我很快注意到,这些字符串的长度恰好匹配明文的长度(我知道明文)。因此,通过对Excel的一些尝试,我发现如果您使用=CODE(<char>)
-函数(因此您可以在默认字符集中获得字符代码,并且反之亦然),并且将该数字与该字母的字符代码进行异或运算应代表你总是得到相同的结果。这意味着我只需要用java和瞧这些值创建一个数组。的Excel示例(在右侧所提到的 “阵列”): 实施例: “>>” 具有(DEC)187的索引,所以187xor253产生70 => “F”
现在,我使用jackcess到访问这些值和“解密”大多是好的,但我有时从字符串中得到错误的字符。在Excel中,一切正常。代码与最好的结果:
public static final int[] DECRYPT_KEY = { 253, 203, 204, 217, 226, 205, 128, 201, 222, 183, 58, 217, 230, 201, 183, 211, 158, 203, 167, 213, 35, 33, 201, 123, 186, 247 };
public static void main(String[] args) throws IOException
{
System.out.println(System.getProperty("file.encoding"));
Database db = DatabaseBuilder.open(new File("/home/***/TM.db"));
Table table = db.getTable("personal");
for (Row row : table)
{
String vorname = row.getString("vorname");
byte[] vornameArr = vorname.getBytes("cp1252");
for (int i1 = 0; i1 < vornameArr.length; i1++)
{
vornameArr[i1] = (byte) ((vornameArr[i1] & 0xff)^DECRYPT_KEY[i1]);
}
System.out.println(new String(vornameArr, "cp1252"));
}
}
但正如我所说,一些字符仍然是错误的,但在Excel中,但一切都很好。当我打印getBytes("cp1272")
给出的数字时,它与Excel完全不同。
你有什么想法,我可能做错了什么,为什么java有时会给出与Excel不同的值?什么是更好的方法?我已经尝试过所有的字符集组合,有些工作在其他人失败的地方,但之后出现了其他错误的结果。
嗯....奇怪。只是为了它,试试“windows-1252”。 “cp1252”是用于java.io API和java.lang API的规范名称,“windows-1253”是用于java.nio API的规范名称。 – DevilsHnd
不,可悲的是它没有帮助。上面显示的名称“Fadima”导致“FadiÝa”。这是唯一的一个,所有其他都很好 – TheFreddy1404