TL; DR:在Java中,將通過charAt
方法將從字符串獲得的字符轉換爲字節總是會產生相同的值?
我正在閱讀使用任意(我們未知)字符編碼進行編碼的文件。我需要解析這些文件並查找某些單詞,例如「標籤」。我對文件內容設置了一些限制,例如「在查找標籤時,」TAG「的字節必須與其ASCII碼錶示相同」。
例如,假設我有以下文件:
0x00 0x11 0x22 0x33 0x54 0x41 0x47 0x77 0x88 0x99 0xaa 0xbb
由於對於T,A和G分別是0x54
,0x41
和0x47
,我可以在文件中找到「TAG」的ASCII值通過解析字節他們自己。
0x00 0x11 0x22 0x33
0x54 0x41 0x47
0x77 0x88 0x99 0xaa 0xbb
不過,我需要進行硬編碼我找字節的值。爲此,我調用String
的charAt(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
A
回答
3
java.lang.string.charAt
將始終返回一個16位的UTF-16字符,當將其轉換爲字節時它將始終保持不變,但由於char
是一個16位無符號數據類型,因此將其轉換爲8位有符號byte
可能會給你不想要的行爲。但是,如果您的源數據是ASCII,則您將獲得您期望的行爲類型。
+0
這是正確的,簡單的演員是危險的。 – 2012-07-24 18:31:56
0
將字符轉換爲字節(byte)
將在所有系統上給出相同的結果。
但是,這是非常罕見的,你需要混合char
和byte
。你應該真的使用其中一種。如果您懷疑混合這些概念可能會導致混淆。
2
是charAt (int)
返回Java定義的字符類型(UTF-16),因此總是與byte
相同。
與此相反String.getBytes()
返回的字節取決於指定的字符集或OS的默認字符集,如果沒有指定。
0
可以使用Character.codePointAt(char c)
方法,而不是直接對它們進行類型轉換。這應該保證你每次都得到相同的結果。
相關問題
- 1. 爲什麼sizeof字符常量是4個字節?
- 2. 檢查字符串變量是否爲某個字符串值
- 3. 字符串是否定義爲不是NSStrings的常量?
- 4. ES2015符號是否適合代替字符串作爲唯一的常量值?
- 5. Javadoc字符串的常量字段值
- 6. 爲什麼某些字符常量寬1字節,其他2字節寬?
- 7. 是否將變量設置爲字符串,字符串文字?
- 8. 如何從系統::字符串轉換爲常量字節*
- 9. 是否值得優化Javascript代碼替換字符串常量?
- 10. 轉換常量字符**爲常量字符*
- 11. 如何將Python 3字節字符串變量轉換爲常規字符串?
- 12. Python的字節對象是否也稱爲字符串?
- 13. 如何檢查字符串是否爲常量 - C
- 14. Java是否爲任何字符(如SPACE)定義了常量?
- 15. 編譯器是否爲常量字符串優化了Stringbuffer/StringBuilder.append()?
- 16. 是否有在C#中的任意字節數組常量
- 17. 是一個常量字符指針,指向一個常量字符或指向字符的常量指針嗎?
- 18. 將字符串數組(字節值)轉換爲字節數組
- 19. 將字節值存儲在字符串中?將字節轉換爲字符串?
- 20. Python 3.6+中是否有格式化的字節字符串字面值?
- 21. C:將常量字符串轉換爲常規字符串
- 22. 是否有用於UTF8字符的分隔符字節?
- 23. jquery,當值爲字符串字符時,變量是undefined
- 24. 檢查字節數組中的字節是否爲Unicode
- 25. 如何檢查特定字符串是否在變量字節變量
- 26. 如何將常量字符*轉換爲常量無符號字符*
- 27. C中的字符串常量與常量字符*
- 28. 多字節字符常量和位圖文件標題類型常量
- 29. 是否可以將python中的數字整數轉換爲1字節字符
- 30. 作爲文字字節的字符串變量
字符串的charAt將始終返回一個16位的UTF-16字符,當您將其轉換爲字節時它將始終保持不變。 – 2012-07-24 18:27:32
如果你不知道編碼,你如何將文件讀入字符串? – 2012-07-24 18:33:59
@RogerLindsjö我沒有將文件讀入字符串。就像我說的,我直接以字節讀取文件。我使用硬編碼的字符串來知道該文件中的內容。 – 2012-07-24 18:54:48