2011-08-21 49 views
2

我認爲這是一個新手類型的問題,但我很理解這一點。將字符串轉換爲字節數組時發生了什麼

我可以找到很多關於如何將字符串轉換爲各種語言的字節數組的帖子。

我不明白的是一個字符的基礎上發生了什麼。 據我所知,屏幕上顯示的每個字符都用一個數字表示,如ascii碼。 (我們可以繼續ASCII的時刻,所以我得到這個概念:-))

這是否意味着,當我想表示一個字符或字符串(這是chartacters的列表)將發生以下情況

將字符轉換爲ASCII值>將ascii值表示爲二進制?

我看過通過將字節數組定義爲輸入字符串長度的1/2來創建字節數組的代碼,所以肯定字節數組的長度是相同的字符串長度?

所以我有點困惑。 基本上我試圖將一個sting值存儲到ColdFusion中的一個字節數組中,我看不到具有顯式字符串的字節數組函數。

但是我可以到底層的java,但我需要知道在理論層面發生了什麼。

在此先感謝您,請告訴我,如果您認爲我在狂吠!

格斯

回答

2

在Java中,字符串存儲爲16位char值的數組。字符串中的每個Unicode字符都將作爲一個或(很少)兩個值存儲在數組中。

如果要將一些字符串數據存儲在byte數組中,則需要能夠將字符串的Unicode字符轉換爲字節序列。這個過程被稱爲encoding並且有幾種方法可以做到這一點,每種方法都有不同的規則和結果。如果兩段代碼想要使用字節數組共享字符串數據,則需要同意使用哪種編碼。

例如,假設我們有一個字符串s,我們想要使用UTF-8編碼進行編碼。如果使用UTF-8編碼僅包含ASCII字符的字符串,則輸入中的每個字符都將轉換爲具有該字符的ASCII值的單個字節。我們可以按如下我們的Java字符串轉換爲Java字節數組:

byte[] bytes = s.getBytes("UTF-8"); 

的字節數組bytes現在包含s字符串數據,編碼爲使用UTF-8編碼字節。

現在,我們在某處存儲或傳輸字節,而另一端的代碼想要解碼這些字節回到Java String。它會做一些這樣的:

String t = new String(bytes, "UTF-8"); 

假設沒有出現任何錯誤,該字符串t現在包含相同的字符串數據作爲原始字符串s

請注意,這兩段代碼必須同意使用哪種編碼。如果他們不同意,結果字符串可能爲end up containing garbage,甚至可能根本無法解碼。

+0

我認爲我在這方面得到了更好的處理。基本上我的任務是在Wowza媒體服務器之間傳遞一個加密密鑰,並在iPad上說出帶有安全媒體的網頁.. Wowza的指令是...... 關鍵信息需要作爲16字節的打包數組發送二進制格式: 再次感謝大家,我非常感謝您的協助。 –

0

字符串是根據Charset編碼成字節組。 字符集可以將char編碼爲更多或更少的位,然後是字節。

例如,如果您只需顯示ciphres(10個不同的字符),則可以使用字符集定義每個字符4位,從而獲得每個字節2個字符的表示形式。 操作系統的字符集通常在String到byteArray編碼器中默認選擇。 要獲取字符串,您必須使用相同的字符集解碼該字符串。

+0

我理解通過一個字符集將一個字符表示爲一個數字的概念。以下邏輯是否有效? 字節數組= BA 串= ABC 轉換 'a' 到代表 'A' BA的數[1] =代表性數量爲 'A'; 轉換「B」到代表「B」 BA的數[2] =關於「B」 等通過串代表號碼... 順便說一句感謝您的時間 –

+0

根據你的例子,BA [1]不是絕對代表第一個字符。它應該如果你有一個char = 1字節的字符集。 abc [1]是第一個字符,您可以將其轉換爲一個字節。相反,ba [1]是編碼值的第一個字節。 –

0

你不是在狂叫。在所有事項中要記住的關鍵字串是,對於計算機來說,字符不存在,只有數字存在。沒有像字符,字符串,文本或類似的東西沒有實際通過存儲數字來實現(實際上,這適用於所有數據類型:布爾值實際上是數值範圍很小,枚舉是內部數字等)。這就是爲什麼說一段數據代表「A」或任何其他字符是沒有意義的,你必須知道周圍代碼假設的字符編碼是。

將字符串轉換爲字節數組恰恰發生在有意透視(「應該打印爲'A'」)和內部透視圖(「此存儲單元包含65」)之間的邊界處。因此,要獲得正確的結果,您必須根據幾個可能的字符集之一進行轉換,然後選擇正確的字符集。請注意,JDK提供了不需要字符集名稱的便捷方法,並始終使用從平臺和環境變量中推導出的默認字符集;但是知道自己在做什麼並明確陳述字符集通常總是一個更好的主意,而不是編寫當今有效的代碼,並且在另一臺計算機上執行代碼時神祕地失敗。

相關問題