java 自定義實現base64編碼轉換

来源:http://www.cnblogs.com/yunwuzhan/archive/2017/02/22/6431184.html
-Advertisement-
Play Games

1.base64編碼轉換 所謂base64編碼,即按照規則把字元轉化為"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"這個字元集中的字元。具體規則如下: a.把每3個位元組為一組,共24bit。每6bit一小組,每組前 ...


  1.base64編碼轉換

     所謂base64編碼,即按照規則把字元轉化為"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"這個字元集中的字元。具體規則如下:

  a.把每3個位元組為一組,共24bit。每6bit一小組,每組前面加00,變為32bit。這樣3個位元組被擴展成了4個節,按照上面字元集編碼。

  b.如果位元組數不足3:

          1)當位元組數為2時,共16bit。每6bit一小組,最後一組即只有4bit,則不止前面加00以外,後面也要補00,按照上面字元集編碼,末尾補=。

          2)當位元組數為1時,共8bit。每6bit一小組,最後一組即只有2bit,則不止前面加00以外,後面也要補0000,按照上面字元集編碼,末尾補==.。

  2.電腦如何表示負數。(以byte基本類型為例)

     在java中一個byte為一個位元組共8bit,可表示範圍00000000——11111111(0~255)。在電腦中把0——01111111表示為0~127,把10000000——11111111表示為-128 ~-1。那麼這樣如-127+127,即01111111+10000001=100000000,相加等於模(256),即互為補碼。

  3.java位運算。

    在java中(加,減,乘,除,右移,左移,無符號右移,位與,位或,位異或)操作,均會是首先將byte,short,char轉化為int,再進行相應運算。舉例:

     

public class Test {
	public static void main(String[] args) {
		byte s1 = (byte) 0xFF;// -1
		byte s2 = (byte) 0x80;// -128
		 System.out.println((byte)(s1+s2));//s1+s2=-129,強制轉化為byte,此時溢出,java處理溢出(+-)256*n,256為byte類型的模,則結果為-129+256=127;
		byte s5 = -28;
		System.out.println(s5 << 2);// 結果為-112, 先轉換為int類型,右邊補0,高位捨棄
		System.out.println(s5>>2);//結果為-7,先轉換為int類型,高位補符號位,低位捨棄
		System.out.println(s5>>>2);//結果為1073741817,先轉換為int類型,高位補0,低位捨棄
		System.out.println((s5&0xFC)>>2);
	}
}

  4.java實現base64編碼方式

    

/**
 * @author zyw 2017年2月21日
 */
package test;

import java.io.UnsupportedEncodingException;

/**
 * 1.補碼 2.位運算 3.base64
 * 
 * @description 學習base64加密 第一步,將每三個位元組作為一組,一共是24個二進位位。
 *              第二步,將這24個二進位位分為四組,每個組有6個二進位位。 第三步,在每組前面加兩個00,擴展成32個二進位位,即四個位元組。
 * 
 */
public class Base64 {
	static private final int SIXTEENBIT = 16;
	static private final int EIGHTBIT = 8;
	static private final char PAD = '=';
	public static void main(String[] args) throws UnsupportedEncodingException {
		System.out.println(Base64.toBase64("中國fggfgfgf234234%#$%^#$$", "UTF-8"));//5Lit5Zu9ZmdnZmdmZ2YyMzQyMzQlIyQlXiMkJA==
	}
	/**
	 * base64加密
	 * @param str
	 * @param charsetName
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String toBase64(String str, String charsetName) throws UnsupportedEncodingException {
		if (str.length() < 0)
			return "";
		byte[] text = str.getBytes(charsetName);
		char[] base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();// 加密
		int lengthDataBits = text.length * 8;
		int fewerThan24bits = lengthDataBits % 24;// 加密字元串長度是否超過24
		int numberTriplets = lengthDataBits / 24;
		int number = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;// 計算字元串加密後字元總個數
		char[] toBase64Text = new char[number * 4];// 用來保存結果
		byte s1, s2, s3;
		int index = 0, order = 0;
		for (int i = 0; i < numberTriplets; i++) {
			s1 = text[index++];
			s2 = text[index++];
			s3 = text[index++];
			toBase64Text[order++] = base[(s1 & 0xFC) >> 2];// 第一個6位
			toBase64Text[order++] = base[((s1 & 0x03) << 4) + ((s2 & 0xF0) >> 4)];// 第二個6位
			toBase64Text[order++] = base[((s2 & 0x0F) << 2) + ((s3 & 0xC0) >> 6)];// 第三個6位
			toBase64Text[order++] = base[s3 & 0x3f];// 第四個6位
		}
		/**
		 * 一個位元組的情況:將這一個位元組的8個二進位位最後一組除了前面加二個0以外,後面再加4個0。這樣得到一個二位的Base64編碼,
		 * 再在末尾補上兩個"="號。
		 */
		if (fewerThan24bits == EIGHTBIT) {
			byte last = text[index++];
			toBase64Text[order++] = base[(last & 0xFC) >> 2];
			toBase64Text[order++] = base[((last & 0x03) << 4)];
			toBase64Text[order++] = PAD;
			toBase64Text[order++] = PAD;
		}
		/**
		 * 二個位元組的情況:將這二個位元組的一共16個二進位位,轉成三組,最後一組除了前面加兩個0以外,後面也要加兩個0。
		 * 這樣得到一個三位的Base64編碼,再在末尾補上一個"="號。
		 */
		if (fewerThan24bits == SIXTEENBIT) {
			s1 = text[index++];
			s2 = text[index++];
			toBase64Text[order++] = base[(s1 & 0xFC) >> 2];
			toBase64Text[order++] = base[(s1 & 0x03) << 4 + ((s2 & 0xF0) >> 4)];
			toBase64Text[order++] = base[(s2 & 0x0f) << 2];
			toBase64Text[order++] = PAD;
		}
		return new String(toBase64Text);
	}
}

  

          


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天發佈了MVC4網站,設置好IIS後老是提示“HTTP Error 503. The service is unavailable”, 網上找了好多資料都不行,最後改變一下應用池的ID就可以了。 ...
  • 概述 REST(Representational State Transfer表述性狀態轉移)而產生的REST API的討論越來越多,微軟在ASP.NET中也添加了Web API的功能。 我們看dudu的文章HttpClient + ASP.NET Web API, WCF之外的另一個選擇知道了博客 ...
  • 簡介: 用pyhon爬取動態頁面時普通的urllib2無法實現,例如下麵的京東首頁,隨著滾動條的下拉會載入新的內容,而urllib2就無法抓取這些內容,此時就需要今天的主角selenium。 Selenium是一個用於Web應用程式測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在 ...
  • 概念介紹: 明文指加密前的內容,反之密文指加密後的內容。 密陰指加密或解密過程中,參與運算的關鍵數據。可以是一份映射表,也可以是一些演算法參數等。 演算法指加密或解密規則。 信息涉漏包括明文,密文,密陰或演算法涉漏。任何信息通過萬維網傳輸,就等同於該信息已經涉漏。演算法,密文和密陰(私陰)都涉漏的情況下,明 ...
  • 題目1:創建一個名為Gerbil的類,該類擁有一個整數域gerbilNumber,通過構造器初始化gerbilNumber。創建方法hop()顯示該對象的gerbilNumber,以及“is hopping.” 創建一個ArrayList,並將Gerbil對象添加到該List中。用get()方法遍歷 ...
  • 1.PHP程式員玩轉Linux系列-怎麼安裝使用CentOS 2.PHP程式員玩轉Linux系列-lnmp環境的搭建 有些同學可能覺得我寫的都是啥yum安裝的,隨便配置一下而已,沒啥技術含量,我的目的是讓大家能夠以最簡單的方式實現目的,配置也是能不自定義的的統統不配置,不是為了炫耀會編譯安裝,我覺得 ...
  • OpenCL是一個並行異構計算的框架,包括intel,AMD,英偉達等等許多廠家都有對它的支持,不過英偉達只到1.2版本,主要發展自己的CUDA去了。雖然沒有用過CUDA,但個人感覺CUDA比OpenCL更好一點,但OpenCL支持面更管,CPU,GPU,DSP,FPGA等多種晶元都能支持OpenC ...
  • 上一節我們講過瞭如何在CentOS7.0下安裝MySql服務,如果沒有看到歡迎頁面的朋友,可以加我的個人微信詳聊:litao514148204 附上一節地址:http://www.cnblogs.com/riverdubu/p/6426852.html 關於php-fpm nginx本身不能處理PH ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...