需要帮助从字符串中删除奇怪的字符

时间:2009-07-17 19:55:19

标签: java notepad++

目前,当我使用java.security.signature进行签名时,它会传回一个字符串。 我似乎无法使用这个字符串,因为有一些特殊的字符,只有在我将字符串复制到notepad ++时才能看到,如果我删除这些特殊字符,我可以使用我程序中字符串的剩余部分。

在记事本中,它们看起来像带有ACK GS STX SI SUB ETB BS VT的黑盒子

我真的不明白它们是什么,所以很难说如何驾驭它们。

是否有可以运行的功能来删除这些和可能类似的字符?

当我使用帖子中提供的base64类时,我不能回到签名

System.out.println(signature);
String base64 = Base64.encodeBytes(sig);
System.out.println(base64);
String sig2 = new String (Base64.decode(base64));
System.out.println(sig2);

给出输出

”zÌý¥y]žd”xKmËY³ÕN´Ìå}ÏBÊNÈ›`Αrp~jÖüñ0…Rõ…•éh?ÞÀ_û_¥ÂçªsÂk{6H7œÉ/”âtTK±Ï…Ã/Ùê²
lHrM/aV5XZ5klHhLbctZs9VOtMzlfc9Cyk7Im2DOkXJwfmoG1vzxMIVS9YWV6Wg/HQLewF/7X6XC56pzwmt7DzZIN5zJL5TidFRLsc+Fwy/Z6rIaNA2uVlCh3XYkWcu882tKt2RySSkn1heWhG0IeNNfopAvbmHDlgszaWaXYzY=
[B@15356d5

3 个答案:

答案 0 :(得分:5)

你是如何“制作”签名的?如果使用sign方法,则会返回一个字节数组,而不是字符串。这不是某些文本的二进制表示,它只是任意二进制数据。这就是你应该使用的,如果你需要将它转换为字符串,你应该使用base64转换来避免数据损坏。

答案 1 :(得分:5)

奇数字符在那里因为加密签名产生字节而不是字符串。因此,如果您需要可打印的表示形式,则应Base64 encode ithere's a public domain implementation for Java)。

从加密签名中剥离非打印字符会使其无效,因为您将无法使用它进行验证。

更新

  

[B @ 15356d5

这是在字节数组上调用toString的结果。 “[”表示数组,“B”表示字节,“15356d5”表示数组的地址。您应该将解码后的数组传递给[Signature.verify](http://java.sun.com/j2se/1.4.2/docs/api/java/security/Signature.html#verify(byte[]))

类似的东西:

Signature sig = new Signature("dsa");
sig.initVerify(key);
sig.verify(Base64.decode(base64)); // <-- bytes go here

答案 2 :(得分:0)

如果我理解你的问题,你需要摆脱代码低于32的字符,除了char 9(tab),char 10(新行)和char 13(return)。

编辑:我同意其他人的意见,因为处理这样​​的加密输出并不是您通常想要的。