今天突然被问FromBase64String(String)和Encoding.Default.GetBytes(String)有啥区别,我刚开始学C#对这个一脸懵逼,于是总结一下今天查资料的内容。

首先,什么是Base64?

Base64呀,是个加密算法,原理呢在这里不重要,以后有机会补充,这里仅举例。

最初明文:abc——>Base64加密——>密文:YWJj ——>Base64加密——>密文:WVdKag== ——>Base64加密——>密文:V1ZkS2FnJTNEJTNE

密文:V1ZkS2FnJTNEJTNE——>Base64解密——>明文:WVdKag==——>Base64加密——>明文:YWJj——>Base64加密——>最初明文:abc

至此还原成功,可见Base64加密不是一对一的,而且多次加密可以由多次解密还原。

这个FromBase64String(String)方法的意思呢,是跟Base64加密有关系的。

微软给出的解释是:

Converts the specified string, which encodes binary data as base-64 digits, to an equivalent 8-bit unsigned integer array.

将指定的字符串(它将二进制数据编码为 Base64 数字)转换为等效的 8 位无符号整数数组。

翻译成人话为:

把那个“将二进制数据加密为Base64格式数据的指定字符串”转换为“等效的 8 位无符号整数数组”

再翻译成人话:

把被加密成Base64格式字符串的数组还原。

怪不得微软官方给出的例子是这样的。

补充知识:

C# 里的byte对应C++里的unsigned char ,我知道一点点C,这样就一下子理解了。

但是用法上有区别,仅仅是取值范围是0-255

namespace EncodeandDecode
{
class Program
{
static void Main(string[] args)
{
byte[] bytes = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
Console.WriteLine("The byte array: ");
Console.WriteLine(" {0}\n", BitConverter.ToString(bytes));
// BitConverter.ToString(bytes)是转换为16进制字符串 string s = Convert.ToBase64String(bytes);
//s = bytes转换成的16进制字符串再进行Base64加密而生成的字符串
Console.WriteLine("The base 64 string: ");
Console.WriteLine(" {0}\n", s); byte[] newBytes = Convert.FromBase64String(s);
//把s还原回16进制字符串
Console.WriteLine("The restored byte array: ");
Console.WriteLine(" {0}\n", BitConverter.ToString(newBytes));
}
}
}

运行结果为:

The byte array:

02-04-06-08-0A-0C-0E-10-12-14

The base 64 string:

AgQGCAoMDhASFA==

The restored byte array:

02-04-06-08-0A-0C-0E-10-12-14

如果不想加密,就是把byte数组与字符串来回转换怎么搞呢?

namespace StringTurnToByte
{
class Program
{
static void Main(string[] args)
{
string a = "1234";
byte[] newBytes1 = Convert.FromBase64String(a);
//将指定的字符串(它将二进制数据编码为 Base64 数字)转换为等效的 8 位无符号整数数组。
string str1 = System.Text.Encoding.Default.GetString(newBytes1);
Console.WriteLine(str1); byte[] newBytes2 = System.Text.Encoding.Default.GetBytes(a);
//将指定字符串中的所有字符编码为一个字节序列,string转化为byte数组
string str2 = System.Text.Encoding.Default.GetString(newBytes2);
//转换byte为string
Console.WriteLine(str2);
}
}
}

输出结果:

譵?

1234

第一行相当于对1234进行解密,自然出现乱码

第二行1234是对1234字符串转换为 byte数组,然后以字符串的形式输出byte数组

终了

FromBase64String(String)和Encoding.Default.GetBytes(String)的更多相关文章

  1. System.Text.Encoding.Default

    string strTmp = "abcdefg某某某";int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;/ ...

  2. 关于java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)

    public byte[] getBytes(Charset charset) Encodes this String into a sequence of bytes using the given ...

  3. java.lang.String.getBytes(String charsetName)方法实例

    java.lang.String.getBytes(String charsetName) 方法编码将此String使用指定的字符集的字节序列,并将结果存储到一个新的字节数组. 声明 以下是java. ...

  4. 用java String类的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解决乱码问题

    Java中String的数据是如何存储的,查看源代码就可以知道,String的数据是存储在char[] value这样一个成员变量中的,char类型的大小在java中是2个字节 我们还知道,现在普遍使 ...

  5. Tomcat启动服务报错:Unknown version string [3.1]. Default version will be used.

    用Intellij IDEA 部署Web项目,Tomcat启动后报错Unknown version string [3.1]. Default version will be used. 作者的问题出 ...

  6. org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used.报错

    org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default versio ...

  7. Tomcat启动服务报错:Unknown version string [4.0]. Default version will be used.

    Tomcat.jdk.web.xml 对应关系: 版本对应错误,更换便可.(版本往下兼容) web.xml——version2.2——JDK1.1——Tomcat3.3 web.xml——versio ...

  8. Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes(inputString);区别

    Encoding encoding = Encoding.GetEncoding("gb2312"); 与byte[] ping = Encoding.UTF8.GetBytes( ...

  9. Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么?

    Integer.valueof(String s)和Integer.parseInt(String s)的具体区别是什么? Integer.valueof(String s)是将一个包装类是将一个实际 ...

随机推荐

  1. 【串线篇】SQL映射文件EmployeeDao.xml事项

    Dao.xml或者说是mapper.xml一个意思 id:方法名,相当于这个配置是对于某个方法的实现 ,参数类型不用写,()也不用写 resultType:指定方法运行后的返回值类型全类名:(查询操作 ...

  2. Kaggle数据集下载

    Kaggle数据集下载步骤: 安装Kaggle库: 注册Kaggle账户: 找到数据集,接受rules: 在My Account>>API中,点击Create New API Token, ...

  3. js 页面向下滚动

    向下滚动一段距离 距离顶部距离 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; <scrip ...

  4. Hashtable、HashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap区别

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11444013.html 并发场景下的Map容器使用场景 如果对数据有强一致要求,则需使用Hashtab ...

  5. react教程 — 开发 总结

    本文章是在熟练使用 VUE 的基础上,对比VUE 功能进行的一个技术总结. 1.react项目快速搭建  https://blog.csdn.net/mapbar_front/article/deta ...

  6. uni-app获取元素宽高封装

    getElSize(id) { //得到元素的size return new Promise((res, rej) => { uni.createSelectorQuery().select(' ...

  7. 存储-docker存储(12)

    storage driver 和 data volume 是容器存放数据的两种方式 storage driver方式 docker info | grep "Storage Driver&q ...

  8. win10配置 samba

    一.先確認Linux中smb正確配置可以使用命令smbclient -L //localhost/ 二.win10配置1.打開win10對smb1.0/cifs檔共用支援2.本地群組原則編輯,修改如下 ...

  9. ASP.NET Core学习——7

    多环境ASP.NET Core介绍了支持在多种环境中管理应用程序行为的改进,如开发(devlopment),预演(staging)和生成(production).环境变量用来指示应用程序正在运行的环境 ...

  10. 用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)

    目录 目录 前文列表 扩展阅读 前期准备 多对多 使用样例 一直在使用的 session 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hel ...