2011-10-30 173 views
37

是否可以將字符串轉換爲字節數組,然後將其轉換回Java或Android中的原始字符串?將字符串轉換爲字節數組,然後回到原始字符串

我的目標是發送一些字符串到微控制器(Arduino)並將其存儲到EEPROM(它只有1   KB)。我試圖使用MD5散列,但它似乎只是一種單向加密。我能做些什麼來解決這個問題?

+0

使用SHA128如果」試用重新發送字符串到adruino。這是可逆的;但我不知道你是否需要arduino上的代碼。 –

回答

89

我會建議使用字符串的成員,但有一個明確的編碼

byte[] bytes = text.getBytes("UTF-8"); 
String text = new String(bytes, "UTF-8"); 

通過使用(支持所有Unicode和一)明確的編碼,你避免只調用text.getBytes()等方面的問題:

  • 您明確使用特定的編碼,以便您知道以後使用哪種編碼,而不是依賴平臺默認值。
  • 你知道它將支持所有的Unicode(而不是像ISO-Latin-1)。

編輯:即使UTF-8是Android上的默認編碼,我一定會明確這一點。例如,這個問題只是說「在Java或Android中」 - 所以代碼最終會被其他平臺使用是完全可能的。

基本上考慮到正常的Java平臺可以有有不同的默認編碼,我認爲最好是絕對明確的。我看到太多人使用默認編碼和丟失數據來承擔這種風險。

編輯:在我急匆匆地忘記提及,你不必使用編碼的名稱 - 你可以使用Charset來代替。使用Guava我倒是真的使用

byte[] bytes = text.getBytes(Charsets.UTF_8); 
String text = new String(bytes, Charsets.UTF_8); 
+1

是不是UTF-8 android平臺默認? – ewanm89

+1

公共靜態字符集defaultCharset() 自:API等級1 返回系統默認的字符集。這是在VM啓動時確定的,此後不會更改。在Android上,默認字符集是UTF-8。 – ewanm89

+1

@ ewanm89:好的,問題是「在Java還是Android」 - 我個人會對它明確的,因爲在其他Java平臺上它總是默認的。與(比如說)一個servlet共享代碼然後得到錯誤的結果會非常容易。 –

3

使用[String.getBytes()][1]轉換爲字節並使用[String(byte[] data)][2]構造函數轉換回字符串。

+3

...但不要使用那些沒有指定編碼的人,否則你使用的平臺默認編碼甚至可能不支持你的字符串中的所有字符。 –

10

你可以這樣做。

字符串字節數組

String stringToConvert = "This String is 76 characters long and will be converted to an array of bytes"; 
byte[] theByteArray = stringToConvert.getBytes(); 

http://www.javadb.com/convert-string-to-byte-array

字節數組字符串

byte[] byteArray = new byte[] {87, 79, 87, 46, 46, 46}; 
String value = new String(byteArray); 

http://www.javadb.com/convert-byte-array-to-string

+3

我絕對*不會*使用該代碼。它假定平臺默認編碼在兩個地方都使用相同,並且平臺默認編碼處理字符串中的所有字符。 –

+0

Android的默認字符集是UTF-8,與您的建議相同,所以沒有理由不這樣做。如果您打算使用其他類型的編碼,您應該在您的建議中使用該代碼並對其進行調整以適應您使用的任何字符集。 –

+0

無論如何,我仍然會對此表示清楚。看到我剛纔在我自己的答案中留下的評論,我還會將*編輯成答案。 –

0

進口java.io.FileInputStream中; import java.io.ByteArrayOutputStream;

公共類FileHashStream { //寫一個新的方法,將提供一個新的字節數組,並且其中這通常從輸入流

public static byte[] read(InputStream is) throws Exception 
{ 
    String path = /* type in the absolute path for the 'commons-codec-1.10-bin.zip' */; 

    // must need a Byte buffer 

    byte[] buf = new byte[1024 * 16] 

    // we will use 16 kilobytes 

    int len = 0; 

    // we need a new input stream 

    FileInputStream is = new FileInputStream(path); 

    // use the buffer to update our "MessageDigest" instance 

    while(true) 
    { 
     len = is.read(buf); 
     if(len < 0) break; 
     md.update(buf, 0, len); 
    } 

    // close the input stream 

    is.close(); 

    // call the "digest" method for obtaining the final hash-result 

    byte[] ret = md.digest(); 

    System.out.println("Length of Hash: " + ret.length); 

    for(byte b : ret) 
    { 
     System.out.println(b + ", "); 
    } 

    String compare = "49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d"; 

    String verification = Hex.encodeHexString(ret); 

    System.out.println(); 

    System.out.println("===") 

    System.out.println(verification); 

    System.out.println("Equals? " + verification.equals(compare)); 

} 

讀取}

相關問題