首頁>Club>
5
回覆列表
  • 1 # 星夜無雙

    解碼的具體過程:

    編碼的4個位元組剛好對應原始碼的3個位元組,因此在解碼時,每4個位元組處理一次。

    如例:原始碼ABC,透過編碼之後的字串為:QUJD,透過對照base64的ascii表,我們可以得知,編碼的二進位制表示形式為:00010000 00010100 00001001 00000011

    注意編碼的最高兩位和原始碼沒有關係,只是每一個位元組後六位才和原始碼有關,因此編碼中的每個字元我們只處理該字元的後6位二級制編碼。

    由編碼的過程可以得知:1)第一個位元組的前6位,即010000,就是原始碼第一個位元組的前六位;編碼第二個位元組的前2位,即01是原始碼第一個位元組的後兩位;這樣就可以得到原始碼第一個位元組的二級製表示形式為01000001,即就是A。

    對應的程式碼為:

    byteArray[4]=(buteArray[0]<<2) & 0xfc;//得到第一個字元的前6位

    byteArray[4]=byteArray[4] | (buteArray[1]>>4) & 0x03;//將前6位和第二個位元組前2位按位或,得到源字串的第一個位元組

    2)編碼第二個位元組的後4位,即0100,就是原始碼第二個位元組的前4位;編碼第3個位元組的前4位,即0010,就是原始碼第二個位元組的後4位;這樣就可以得到原始碼第2個位元組的二進位制表示形式為01000010,即就是B。

    對應的程式碼為:

    byteArray[4]=(buteArray[1]<<4) & 0xf0;//得到第2個字元的後4位

    byteArray[4]=byteArray[4] | (buteArray[2]>>2) & 0x0f;//將第二個位元組後4位和第三個自己的前4位按位或,得到源字串的第2個位元組

    3)編碼第三個位元組的後2位,即01,就是原始碼第3個位元組的前3位;編碼第4個位元組的前6位,即000011,就是原始碼第3個位元組的後6位;這樣就可以得到原始碼第3個位元組的二進位制表示形式為01000011,即就是C。

    對應的程式碼為:

    byteArray[4]=(buteArray[2]<<6) & 0xc0;//得到第3個字元的後2位

    byteArray[4]=byteArray[4] | (buteArray[3]>>2) & 0x3f;//將第3個位元組後2位和第4個自己的前6位按位或,得到源字串的第3個位元組

    編碼共四個位元組,處理完成,最終得到的解碼字串為ABC。

    對於編碼中的=,我們不需要去處理它,這是因為該字元只是base64編碼時加的一個字元,其實的編碼時在最後一個字元加了00,因此不用去處理。而且這個字元如果存在,只可能在編碼字串的後兩個位元組或一個位元組才有的,因此在解碼之前,就將該字元剔除。

  • 中秋節和大豐收的關聯?
  • 燒一隻大豬怎樣燒?