签名变更
任何人都可以建议我如何将字节数组转换为字符串? 此方法不起作用:
byte [] my_array=....; String my_string = new String (my_array);
要么
String my_string = my_array.toString();
我想要做的是将签名转换为字符串并将其传递给另一方。 但是当我使用上面的方法和方法时,my_string.getBytes()签名会发生变化,然后无法validation。
我的意思是例如my_string在我执行my_string.getBytes().toString()
或my_array之后发生更改(new String(my_array)).getBytes()
谢谢。
(您没有明确说明,但我假设您的字节数组是某种加密签名。)
你在这做错了两件事:
- 试图直接从任意字节数组创建一个字符串:你的字节数组不代表编码文本,所以不要这样对待它。
- 即使它确实如此 ,你也会使用平台默认编码,这几乎总是一个坏主意。
以可逆forms将任意二进制数据作为文本处理的最常用方法是使用base64 。 这里有一个公共域base64 Java库(还有很多其他免费选项):
byte[] signature = ...; String signatureBase64 = Base64.encode(signature); // Propagate signatureBase64 to the other side, then... byte[] signature = Base64.decode(signatureBase64);
new String()
和getBytes()
隐式使用平台默认编码并重载以允许您指定编码(几乎总是应该这样做)。 显然,您的平台默认编码不能代表arrays中的所有字节值。
但是想要将字节转换为String并返回几乎总是首先要做的事情。 这个“签名”究竟包含什么,以及你认为必须将它转换为String的“另一面”是什么?
您必须将字节数组编码到Base64中。 您还可以使用javax.xml.bind.DatatypeConverter的方法 – printBase64Binary()
和parseBase64Binary()
来编码或解码Base64。