2012-07-24 42 views
1

TL; DR:在Java中,將通過charAt方法將從字符串獲得的字符轉換爲字節總是會產生相同的值?

我正在閱讀使用任意(我們未知)字符編碼進行編碼的文件。我需要解析這些文件並查找某些單詞,例如「標籤」。我對文件內容設置了一些限制,例如「在查找標籤時,」TAG「的字節必須與其ASCII碼錶示相同」。

例如,假設我有以下文件:
0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb
由於對於T,A和G分別是0x540x410x47,我可以在文件中找到「TAG」的ASCII值通過解析字節他們自己。
0x00 0x11 0x22 0x330x54 0x41 0x470x77 0x88 0x99 0xaa 0xbb

不過,我需要進行硬編碼我找字節的值。爲此,我調用StringcharAt(int i)方法並將char轉換爲一個字節。

這裏,例如,如何我願意爲 'T' 的字節表示驗證的任意字節(稱爲b):
String tag = "TAG";
char t = tag.charAt(0);
if ((byte)t == b){
                //magic goes here, such as comparing the 'A' and the 'G'
}
注意:代碼實際上不是這樣,驗證算法更優雅。

這適用於我的本地機器。但是,這將在可能包含非常奇怪的編碼的機器上運行。我擔心的是,將一個字符獲得的字符與charAt轉換爲一個字節可能會產生不同的值,具體取決於機器。我知道Java始終使用UTF-16字符編碼編碼char,但我擔心從字符串轉換爲字符然後轉換爲字節可能會產生奇怪的結果。

因此,簡而言之,將通過charAt方法將通過字符串獲得的字符投射到一個字節總是會產生相同的值?還是會依賴外部因素?

感謝您的幫助!

:我不能硬編碼的字節本身(在,例如,一個字節數組),因爲它們可以非常非常長的,並且可以在將來非常經常改變。Java:String的字符值(字節)是否爲常量?

+1

字符串的charAt將始終返回一個16位的UTF-16字符,當您將其轉換爲字節時它將始終保持不變。 – 2012-07-24 18:27:32

+2

如果你不知道編碼,你如何將文件讀入字符串? – 2012-07-24 18:33:59

+0

@RogerLindsjö我沒有將文件讀入字符串。就像我說的,我直接以字節讀取文件。我使用硬編碼的字符串來知道該文件中的內容。 – 2012-07-24 18:54:48

回答

3

java.lang.string.charAt將始終返回一個16位的UTF-16字符,當將其轉換爲字節時它將始終保持不變,但由於char是一個16位無符號數據類型,因此將其轉換爲8位有符號byte可能會給你不想要的行爲。但是,如果您的源數據是ASCII,則您將獲得您期望的行爲類型。

+0

這是正確的,簡單的演員是危險的。 – 2012-07-24 18:31:56

0

將字符轉換爲字節(byte)將在所有系統上給出相同的結果。

但是,這是非常罕見的,你需要混合charbyte。你應該真的使用其中一種。如果您懷疑混合這些概念可能會導致混淆。

2

charAt (int)返回Java定義的字符類型(UTF-16),因此總是與byte相同。

與此相反String.getBytes()返回的字節取決於指定的字符集或OS的默認字符集,如果沒有指定。

0

可以使用Character.codePointAt(char c)方法,而不是直接對它們進行類型轉換。這應該保證你每次都得到相同的結果。

相關問題