Java 字符串與byte之間的相互轉(zhuǎn)換

寫在前面

上次在簡書上第一次發(fā)表文章多了30位朋友關(guān)注和收到80多個喜歡讓我受寵若驚。我當時打算以后要多寫一些有價值的文章刘陶,才對得起關(guān)注我的朋友。然而疑苫,愛游戲的我在剛不久前把四公主接回來了~這一個多月都沉迷于游戲世界... 游戲世界也同樣精彩纷责,但現(xiàn)實的世界更精彩~今天就先寫一個簡單的東西,讓我先找回狀態(tài)再膳。

哦!對了喂柒,如果ps4玩家有興趣的話禾嫉,可以私信我或者在下面評論蚊丐,加個好友,有空的話一起玩玩游戲孽椰,雖然我是單機游戲愛好者~


正文

你是否跟我一樣凛篙,在一些需要加密的代碼里看見需要把字符串轉(zhuǎn)換為字節(jié)的場景,例如MD5加密鞋诗。而你每次看到像我以前一樣,自動地略過(反正別人都寫好了全庸,我用就是了)融痛。如果是的話壶笼,不要再逃避了雁刷,下面跟我一起來了解一下字符串與byte之間轉(zhuǎn)換的原理

  • 原理
    我們都知道,在Java里byte類型是占用1個字節(jié)责语,即8位的目派,而16進制的字符占用4位坤候,所以每個byte可以用兩個字符來表示白筹,反之亦然。

  • 舉個栗子

byte = 123
用二進制表示:0111 1011
每4位用字符表示: 7 b

注意:java是用補碼來進行二進制計算的徒河,因為上面最高位為0送漠,即為正數(shù),而正數(shù)的補碼為自身闽寡,所以沒什么問題纵穿,下面看看負數(shù)的栗子:

16位進制字符串表示: a b
用二進制表示:1010 1011
二進制補碼: 1101 0101
byte:-85 (如果不用補碼計算奢人,應(yīng)該為171淆院,超出byte的范圍了)

是的,原理就這么簡單支救,接下來用代碼實現(xiàn):

  • byte[] 轉(zhuǎn)16進制字符串

法1
思路:先把byte[] 轉(zhuǎn)換維char[]拷淘,再把char[] 轉(zhuǎn)換為字符串

    public static String bytes2Hex(byte[] src) {
        if (src == null || src.length <= 0) {   
            return null;   
        } 
        
        char[] res = new char[src.length * 2]; // 每個byte對應(yīng)兩個字符
        final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        for (int i = 0, j = 0; i < src.length; i++) {
            res[j++] = hexDigits[src[i] >> 4 & 0x0f]; // 先存byte的高4位
            res[j++] = hexDigits[src[i] & 0x0f]; // 再存byte的低4位
        }

        return new String(res);
    }

法2
思路:先把byte轉(zhuǎn)換為int類型,再轉(zhuǎn)換為字符串

    public static String bytes2Hex(byte[] src){   
        if (src == null || src.length <= 0) {   
            return null;   
        } 
        
        StringBuilder stringBuilder = new StringBuilder("");         
        for (int i = 0; i < src.length; i++) {   
            // 之所以用byte和0xff相與贬堵,是因為int是32位结洼,與0xff相與后就舍棄前面的24位,只保留后8位
            String str = Integer.toHexString(src[i] & 0xff); 
            if (str.length() < 2) { // 不足兩位要補0
                stringBuilder.append(0);   
            }   
            stringBuilder.append(str);   
        }   
        return stringBuilder.toString();   
    } 
  • 16進制字符串轉(zhuǎn)byte[]

思路:先把字符串轉(zhuǎn)換為char[]蒸殿,再轉(zhuǎn)換為byte[]鸣峭。
因為兩個字符對應(yīng)一個byte,所以字符串的長度不能為奇數(shù)喔(哪位有想到好辦法解決這一問題的摊溶,求告知)。

    public static byte[] hex2Bytes(String hexString) {   
        if (hexString == null || hexString.equals("")) {   
            return null;   
        }   

        int length = hexString.length() / 2;   
        char[] hexChars = hexString.toCharArray();   
        byte[] bytes = new byte[length];   
        String hexDigits = "0123456789abcdef";
        for (int i = 0; i < length; i++) {   
            int pos = i * 2; // 兩個字符對應(yīng)一個byte
            int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1
            int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2
            if(h == -1 || l == -1) { // 非16進制字符
                return null;
            }
            bytes[i] = (byte) (h | l);   
        }   
        return bytes;   
    }

注:注1得到xxxx0000盖腕,注2得到0000xxxx浓镜,相或就把兩個字符轉(zhuǎn)換為一個byte了。

  • 再舉個栗子

md5加密

    public static String getMd5ByFile(File file) {
        String ret= null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[1024];
            int len;
            while((len = fis.read(buffer)) > 0) {
                md.update(buffer, 0, len);
            }
            ret = bytes2Hex(md.digest()); // 把md5加密后的byte[]轉(zhuǎn)換為字符串
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        return ret;
    }

寫在最后

好了听隐,應(yīng)該懂了吧哄啄,其實并不難的风范。上面的是我個人的理解沪么,難免有錯。若有錯禽车,歡迎指正。

如果這篇文章對你有幫助的話州胳,不妨點個喜歡唄~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逸月,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碗硬,更是在濱河造成了極大的恐慌,老刑警劉巖岭粤,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件特笋,死亡現(xiàn)場離奇詭異,居然都是意外死亡虎囚,警方通過查閱死者的電腦和手機蔫磨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堤如,“玉大人,你說我怎么就攤上這事蝗岖±浦粒” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵铅鲤,是天一觀的道長划提。 經(jīng)常有香客問我邢享,道長,這世上最難降的妖魔是什么掸犬? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任绪爸,我火速辦了婚禮宙攻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘座掘。我一直安慰自己,他們只是感情好萍虽,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布形真。 她就那樣靜靜地躺著,像睡著了一般邓馒。 火紅的嫁衣襯著肌膚如雪蛾坯。 梳的紋絲不亂的頭發(fā)上光酣,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天救军,我揣著相機與錄音倘零,去河邊找鬼唱遭。 笑死视事,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的跌穗。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼锈拨,長吁一口氣:“原來是場噩夢啊……” “哼羹唠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起佩微,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谷浅,沒想到半個月后奶卓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一疯,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡墩邀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年盏浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辣往。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡殖卑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孵稽,到底是詐尸還是另有隱情,我是刑警寧澤菩鲜,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布接校,位于F島的核電站狮崩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睦柴。R本人自食惡果不足惜毡熏,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狱窘。 院中可真熱鬧,春花似錦蘸炸、人聲如沸尖奔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膘滨。三九已至,卻和暖如春丹弱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躲胳。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工纤勒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人摇天。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓泉坐,卻偏偏與公主長得像为鳄,于是被迫代替她去往敵國和親腕让。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 常量的概述和使用 A:什么是常量在程序執(zhí)行的過程中其值不可以發(fā)生改變 B:Java中常量的分類字面值常量自定義常量...
    野望君閱讀 614評論 0 0
  • 網(wǎng)站亂碼問題我們會經(jīng)常碰到静袖,大多見于非英文的中文字符或其他字符亂碼壳猜,而且,這類問題常常是因為編碼方式問題统扳,主要原因...
    波段頂?shù)?/span>閱讀 2,842評論 1 9
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記行冰,在此感謝他和像他一樣...
    Gibbs基閱讀 37,141評論 8 114
  • 編寫java程序 step1: 用文字處理軟件編寫Java源程序, 以擴展文件名.java保存. step2: 調(diào)...
    o0寳貝閱讀 450評論 0 1
  • 石濤有詩“荷葉五寸荷花嬌”悼做,莫名歡喜將它請來作為開篇,依禮而謝肛走。我并沒有拍到荷花,卻擁有了荷花的心情朽色,且是滿懷。 ...
    弘緣問文閱讀 689評論 14 16