<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          公廁里的二進(jìn)制究竟寫的什么。。。

          共 3066字,需瀏覽 7分鐘

           ·

          2024-04-18 22:46

          (關(guān)注數(shù)據(jù)結(jié)構(gòu)和算法,了解更多新知識(shí))


          某公廁分別用中文,英文,語和語寫了下面一段提示:向前一小步,文明一大步。這種提示在男廁所基本上是見怪不怪了,但關(guān)鍵是下面還有一段用0和1組成的數(shù)字,這又什么意思,難道是給外星人看的?



          作為一個(gè)程序員能敏銳的感覺到這應(yīng)該就是上面中文的二進(jìn)制表示方式,于是我就嘗試著把它轉(zhuǎn)化為漢字,看看轉(zhuǎn)換之后對(duì)不對(duì)。

          我們都知道漢字在計(jì)算機(jī)中存儲(chǔ)常見的編碼有GB2312,GBK,UTF-8,但仔細(xì)觀察上面的二進(jìn)制會(huì)發(fā)現(xiàn)很多地方出現(xiàn)了連續(xù)的3個(gè)1,所有大膽猜測(cè)應(yīng)該使用的是UTF-8編碼(當(dāng)然只是猜測(cè))。


          猜完之后我們?cè)賮眚?yàn)證下,在驗(yàn)證之前我們先要了解下UTF-8的實(shí)現(xiàn)原理。UTF-8是一種可變長字符編碼,它可以用來表示Unicode標(biāo)準(zhǔn)中的任何字符,而且其編碼中的第一個(gè)字節(jié)仍與ASCII相容,使得原來處理ASCII字符的軟件無須或只進(jìn)行少部分修改后,便可繼續(xù)使用。


          UTF-8通常使用1~4個(gè)字節(jié)表示字符,怎么確定一個(gè)字符占幾個(gè)字節(jié)呢?這就和二進(jìn)制的表示有關(guān),如果是一個(gè)字節(jié),那么最高位就是0,剩下的7個(gè)二進(jìn)制可以表示128個(gè)字符,這些字符對(duì)應(yīng)ASCII的128個(gè)字符。如果是兩個(gè)字節(jié)會(huì)以110開頭,三個(gè)字節(jié)是1110開頭……。

          0xxxxxxx 一個(gè)字節(jié)110xxxxx 10xxxxxx 兩個(gè)字節(jié)1110xxxx 10xxxxxx 10xxxxxx 三個(gè)字節(jié)11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四個(gè)字節(jié)
          兩個(gè)以上字節(jié)的后面每個(gè)字節(jié)都是以10開頭,搞懂了UTF-8的原理我們?cè)賮砜聪鹿珟亩M(jìn)制編碼,首先他是以1110開頭的,所以第一個(gè)字符肯定是三個(gè)字節(jié),也就是24位(每個(gè)字節(jié)占8位),我們截取前面24位來轉(zhuǎn)換下。

          11100101 10010000 10010001

          其中紅色部分是標(biāo)志位,我們把它去掉就變成了0101 010000 010001,這是個(gè)二進(jìn)制,我們把它轉(zhuǎn)化為十六進(jìn)制就是5411,那么這個(gè)數(shù)字在unicode字符集中對(duì)應(yīng)的字符是哪個(gè)呢,我們轉(zhuǎn)換看下。


          通過轉(zhuǎn)換我們發(fā)現(xiàn)他就是漢字“向”,所以我們猜測(cè)他使用的UTF-8編碼是正確的,后面的就不在一個(gè)個(gè)手動(dòng)轉(zhuǎn)了,我們使用一段代碼把它全部轉(zhuǎn)化下。

          JAVA:
          private static void toChinese() {
              String bits = "11100101100100001001000111100101100010011000110" +
                      "1111001001011100010000000111001011011000010001111111001" +
                      "10101011011010010100100000111001101001011010000111111001" +
                      "10100110001000111011100100101110001000000011100101101001" +
                      "0010100111111001101010110110100101";
              int length = bits.length();
              byte[] bytes = new byte[length >> 3];
              for (int i = 0; i < length; i += 8) {
                  String byteString = bits.substring(i, i + 8);
                  bytes[i >> 3] = (byte) Integer.parseInt(byteString, 2);
              }
              System.out.println("轉(zhuǎn)換之后的結(jié)果:" + new String(bytes));
          }

          打印的結(jié)果如下。




          筆者簡(jiǎn)介
          博哥,真名:王一博,畢業(yè)十多年,《算法秘籍》作者,專注于數(shù)據(jù)結(jié)構(gòu)和算法的講解,在全球30多個(gè)算法網(wǎng)站中累計(jì)做題2000多道,在公眾號(hào)中寫算法題解800多題,對(duì)算法題有自己獨(dú)特的解題思路和解題技巧,喜歡的可以給個(gè)關(guān)注,也可以下載我整理的1000多頁的PDF算法文檔


          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产福利在线播放 | 大香蕉视频在线精品 | 激情99| 免费一级特黄录像 | 亚洲色情在线 |