工程師 Mars
工程師 Mars

在這裡我想跟你分享如何成為一位稱職的軟體工程師, 你將會學到許多網站架設、WordPress、程式交易、資料庫等技能。 讓你在職場表現令人讚賞,年年升職加薪。 轉職成功,走在科技路上,永遠不怕被淘汱。 提昇技術能力,接案賺外快,自己為自己加薪。 個人技術 Blog 連結 https://blog.hungwin.com.tw/

[C#] Base64 Convert.ToBase64String 基本轉碼及適用網址參數轉碼延伸應用

這次示範一個 C# 內將字串轉為 Base64 字串的語法,並利用此轉換方法延伸到適用網址上傳遞參數的改法

什麼是 Base64

Base64 是一組基於 64 個可列印字元的索引轉換表。在 Base64 中的可列印字元包括字母 A-Z、a-z、數字 0-9,再加上範號 + / 組成 64 個索引字元。

Base64索引表

來源: 維基百科

在 C# 中可以將任何字串經由 Encoding.UTF8.GetBytes 即可取得 2 進位的編碼,再將此 2 進位對應 Base64 索引編碼就可以換成為 Base64 字串。

取得字串的 2 進位編碼 (Bytes) 有多種方法 字元集 UTF8, ASCII 或其他字元集編碼均可,但我建議使用 UTF8 編碼,這樣可支援的文字更多。

範例 1 ToBase64String 基本轉碼

先看一下此範例輸出的結果


來看看程式碼

StringBuilder sbSample = new StringBuilder();

string inputText = "Test中文"; // 來源文字
sbSample.Append("原始文字: " + inputText + "<br>");

// 轉換
Byte[] bytesEncode = System.Text.Encoding.UTF8.GetBytes(inputText); //取得 UTF8 2進位 Byte
string resultEncode = Convert.ToBase64String(bytesEncode); // 轉換 Base64 索引表
sbSample.Append("Base 64 轉換結果: " + resultEncode + "<br>");

// 還原
Byte[] bytesDecode = Convert.FromBase64String(resultEncode); // 還原 Byte
string resultText = System.Text.Encoding.UTF8.GetString(bytesDecode); // 還原 UTF8 字元
sbSample.Append("還原結果: " + resultText);

// 輸出網頁
ViewBag.resultText = sbSample.ToString();

範例 2 ToBase64String 適用網址參數轉碼

這個範例是第 1 個範例的延伸應用,因為在 Base64 轉換後的字元中有 = + / 等字元,= + / 這些字元不適合直接放在網址中當參數傳遞,會與網址的關鍵字重複導致判斷錯誤,如果要將轉換結果放至網址中當參數使用,需要做一些修改。

先看一下這次修改的範例畫面


這次範例中轉換後的 Base64 少了後面兩個 ==

可是當轉換回原本字元時並不影響結果,那是因為 == 是為了滿足 Base64 足夠位元數計算而加上去的,只要了解原理就可以在轉碼網址參數上先隱藏,待解碼時再加回來。

在網址中還有 + / 都會影響判斷,只要在編碼時取代掉,待解碼時轉換回來即可。

來看看這次修改的程式碼

StringBuilder sbSample = new StringBuilder();

string inputText = "Test中文"; // 來源文字
sbSample.Append("原始文字: " + inputText + "<br>");

// 網址參數轉換
Byte[] bytesEncode = System.Text.Encoding.UTF8.GetBytes(inputText); //取得 UTF8 2進位 Byte
string resultEncode = Convert.ToBase64String(bytesEncode); // 轉換 Base64 索引表
resultEncode = resultEncode.Split('=')[0]; // Remove any trailing '='s
resultEncode = resultEncode.Replace('+', '-'); // 62nd char of encoding
resultEncode = resultEncode.Replace('/', '_'); // 63rd char of encoding

sbSample.Append("Base 64 轉換結果: " + resultEncode + "<br>");

// 還原
resultEncode = resultEncode.Replace('-', '+'); // 62nd char of encoding
resultEncode = resultEncode.Replace('_', '/'); // 63rd char of encoding

switch (resultEncode.Length % 4) // Pad with trailing '='s
{
	case 0:
		break; // No pad chars in this case
	case 2:
		resultEncode += "==";
		break; // Two pad chars
	case 3:
		resultEncode += "=";
		break; // One pad char
	default:
		throw new ArgumentOutOfRangeException(
			nameof(resultEncode), "Illegal base64url string!");
}
Byte[] bytesDecode = Convert.FromBase64String(resultEncode); // 還原 Byte
string resultText = System.Text.Encoding.UTF8.GetString(bytesDecode); // 還原 UTF8 字元
sbSample.Append("還原結果: " + resultText);
ViewBag.resultText = sbSample.ToString();

// 輸出網頁
ViewBag.resultText = sbSample.ToString();

實用方法整理

以上做了 2 個範例,可以了解 Base64 轉換的方式,但這種常用的方法就是要獨立出來方便呼叫,那我就提供我自己整理好的獨立方法給各位參考。

Base 64 轉碼/解碼

/// <summary>
/// Base 64 轉碼
/// </summary>
/// <param name="plainText"></param>
/// <returns></returns>
public static string EncodeBase64(string plainText)
{
	var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
	return System.Convert.ToBase64String(plainTextBytes);
}

/// <summary>
/// Base 64 解碼
/// </summary>
/// <param name="base64EncodedData"></param>
/// <returns></returns>
public static string DecodeBase64(string base64EncodedData)
{
	var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
	return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

Base64 Url 轉碼/解碼

/// <summary>
/// Base 64 Url 轉碼
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string EncodeBase64Url(string input)
{
	byte[] b = Encoding.UTF8.GetBytes(input);
	var output = Convert.ToBase64String(b);

	output = output.Split('=')[0]; // Remove any trailing '='s
	output = output.Replace('+', '-'); // 62nd char of encoding
	output = output.Replace('/', '_'); // 63rd char of encoding

	return output;
}

/// <summary>
/// Base 64 Url 解碼
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string DecodeBase64Url(string input)
{
	var output = input;

	output = output.Replace('-', '+'); // 62nd char of encoding
	output = output.Replace('_', '/'); // 63rd char of encoding

	switch (output.Length % 4) // Pad with trailing '='s
	{
		case 0:
			break; // No pad chars in this case
		case 2:
			output += "==";
			break; // Two pad chars
		case 3:
			output += "=";
			break; // One pad char
		default:
			throw new ArgumentOutOfRangeException(
				nameof(input), "Illegal base64url string!");
	}

	byte[] converted = Convert.FromBase64String(output); // Standard base64 decoder

	string str = Encoding.UTF8.GetString(converted);

	return str;
}

重點整理

  1. Base64 是一組基於 64 個可列印字元的索引轉換表
  2. 使用 ToBase64String() 可轉碼為 Base64
  3. 避開網址關鍵字 = + / 就可適用在網址上

相關學習文章

原始文章連結: https://blog.hungwin.com.tw/csharp-convert-tobase64string/

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论