日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

byte比较_byte[]与String互转不一致引起的bug

發布時間:2023/12/19 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。