[C#] Base64 Convert.ToBase64String 基本转码及适用网址参数转码延伸应用

这次示范一个 C# 内将字串转为 Base64 字串的语法,并利用此转换方法延伸到适用网址上传递参数的改法

什麽是 Base64

Base64 是一组基於 64 个可列印字元的索引转换表。在 Base64 中的可列印字元包括字母 A-Z、a-z、数字 0-9,再加上范号 + / 组成 64 个索引字元。

Base64索引表

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;
}

重点整理

Base64 是一组基於 64 个可列印字元的索引转换表
使用 ToBase64String() 可转码为 Base64
避开网址关键字 = + / 就可适用在网址上

相关学习文章

[C#]QR Code 网址产生与解析 (附范例)
[C#] Base32 编码/解码方法 不分大小写的编码方式


<<:  Ruby--Find the Difference

>>:  基金走势再现黑色星期五?白酒股集体受挫!

Day19:[排序演算法]Bubble Sort - 气泡排序法

bubble sort的概念就是像泡泡一样 ,越大的数字会渐渐的往右边浮 比较相邻的元素 ,两两比...

R语言-4-函数

每一个动作都是函数 语法 A::install.packages("aa") ...

Day28 - 部属到正式环境 (3)

今天的实作内容主要根据教学网站进行。 将应用程序安装到Heroku (接续Day27) 使用GIT将...

[Android Studio 30天自我挑战] LinearLayout元件对齐方式

LinearLayout是透过android:orientation来设定布局方向 分为 andro...

Vue.js 从零开始:Hoisting , undefined,not defined

续上一篇文章,写到後面还有一些观念没有讲得很清楚,像是var有Hoisting的特性,coding的...