byte比较_byte[]与String互转不一致引起的bug
??公告:文章會第一時間發在微信公眾號《魔笛手CTO》,歡迎關注
String看到上面的代碼,可能有同學會問了,這不就是JAVA的基本操作嗎,你老張有什么好講的?
既然這樣,老張要考考大家,猜一下下面的代碼執行之后會輸出怎樣的結果。
public現在揭曉答案:
原來字符轉為字節的長度為:10加密字符轉為字節的長度為:26
不知道各位同學有沒有猜對,說來慚愧,老張剛剛踩過這個坑。
事情的起因是這樣的,由于Java沒有內置的RC4加密,老張需要自己封裝實現,實現的過程中用到了字節和字符的互相轉換。因為RC4只是在針對的byte[]上進行位移操作,所以其輸入輸出的字節長度應該是相等的。但是老張為了使加密能夠應用于字符串,用字符串對加密方法做了一層封裝。問題就出在這一層封裝上。
且聽老張給你慢慢道來。
什么是字節?
位是計算機內部的最小數據儲存單位,8位就組成了1字節,也就是java中的byte。
什么是字符?
字符是指字母、數字、特殊符號的集合,也就是java中的char和String。
字節怎么就變成了字符?
答案是字符編碼。比較出名的字符集是ascii、gb2312、utf-8等。其中ascii和gb2312是定長字符編碼,一個字符分別占用1字節、2字節,而utf-8是變長字符編碼,最短為1字節,最常為4字節。
以ascii為例,字母A在計算機中的存儲為0b0100 0001。
到這里可能有同學已經知道老張一開始天真在哪里了?
如果只是字符串轉為字節流之后又接著轉為字符串也沒什么問題。老張天真就天真在對utf-8得到的字節流做了位移操作之后,還期望能夠用utf-8重新解析字節流。
敲黑板:Java中String內置的public String(byte[] bytes)和public byte[] getBytes()對于不合法的utf-8字節流在解析時會增刪字節。
希望各位同學引以為戒!
最后如何避免在使用加密算法時出現字節和字符的異常轉化,歡迎各位同學能夠留言,有需要RC4加密代碼的也可以在后臺留言。
總結
以上是生活随笔為你收集整理的byte比较_byte[]与String互转不一致引起的bug的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想拯救者 Y900 旗舰安卓平板 3
- 下一篇: 全额补贴首重运费是什么意思