2011-12-20 59 views
0

任何人都可以建议我如何将字节数组转换为字符串?此方法不起作用:签名更改

byte [] my_array=....; 
String my_string = new String (my_array); 

String my_string = my_array.toString(); 

我想要做的是签名转换为字符串,并把它传递给这样对方。但是,当我使用上面的方法和方法,然后my_string.getBytes()签名更改,然后无法验证。

我的意思是比如my_string变化,当我做my_string.getBytes().toString() 或之后my_array变化(new String(my_array)).getBytes()

感谢。

+0

您需要指定从字节数组转换为字符串时的编码。构造函数'String(byte [] bytes)'使用系统的默认字符集。有一个构造函数接受数组和字符集。 – khachik 2011-12-20 14:39:36

+0

你需要澄清什么样的数据是你的输入(字节[],但包含什么),你想要做什么样的“转换”以及你想要做什么?(什么是“传递给另一个方“的意思)。为什么你不能通过字节[]? – Viruzzo 2011-12-20 14:42:08

回答

4

(你有没有说得这么明确,但我假设你的字节数组是某种形式的加密签名。)

你做错了两两件事:

  • 尝试直接从任意字节数组创建一个字符串:你的字节数组而不是代表编码文本,所以不要这样对待它。
  • 即使它确实,您将使用平台默认编码,这几乎总是一个坏主意。

以可逆形式处理作为文本的任意二进制数据的最常见方式是使用base64。有一个公共领域的base64 Java库here(和很多其他的自由选择太):

byte[] signature = ...; 
String signatureBase64 = Base64.encode(signature); 

// Propagate signatureBase64 to the other side, then... 

byte[] signature = Base64.decode(signatureBase64); 
+0

是的,我使用它,例如:Base64.encodeBase64(signature);返回字节数组。我使用import org.apache.commons.codec.binary.Base64;我应该使用什么库来处理像Base64.encode(签名)这样的方法;谢谢 – innspiron 2011-12-20 14:44:18

+0

@innspiron:我在我的答案中加入了一个链接...它有一个比Apache Commons Codec更好的API,IMO。 – 2011-12-20 14:46:31

+0

为了使用apache commons解码器库返回字符串,您需要使用Base64。encodeBase64String(byte [] input)//返回字符串 – viper 2012-07-02 16:17:39

1

两个new String()getBytes()隐含的使用平台默认的编码和重载允许你指定的编码(这应该总是做完了)。显然你的平台默认编码不能表示你阵列中的所有字节值。

但是,想要将字节转换为字符串并返回,几乎总是首先要做的错误事情。这个“签名”究竟包含什么,以及你认为你必须将它转换为String的这个“另一方”是什么?

0

您必须将字节数组编码为Base64.您也可以使用javax.xml.bind.DatatypeConverter的printBase64Binary()parseBase64Binary()方法对Base64进行编码或解码。

+0

工作:)谢谢大家。 – innspiron 2011-12-20 14:55:31