2011-12-20 60 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