今天突然被问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. PostgreSQL按年月日分组(关键词:extract time as Year/Month/Day)

    Select EXTRACT(year from cast(joindate as timestamp)) as Year, EXTRACT(month from cast(joindate as t ...

  2. Update Vim to 8.0 in Ubuntu

    add PPA sudo add-apt-repository ppa:jonathonf/vim Update and Install sudo apt-get update sudo apt-ge ...

  3. 卸载Anaconda

    conda install anaconda-clean anaconda-clean --yes Anaconda 安装的时候在 .bash_profile中添加了变量: export PATH=& ...

  4. CSP2019赛前小复习:

    虽然觉得复习也没有什么用,还不吃好睡好,保持好心情. SA: 坑就那几个. \(s[0]=s[n+1]=-1\). 和\(rank\)交换的\(tp\)数组的\(tp[n+1]=0\). 一般加上这两 ...

  5. Python--同步锁(互斥锁)、死锁(状态)、递归锁、信号量、Event对象

    同步锁/互斥锁 (Lock) import time import threading def sub(): global num #在每个线程中都获取这个全局变量 #num-=1 temp=num ...

  6. sql 基础语法3:分组,聚合函数,having,联合查询,快速备份,内联函数

    select * from Classinfo select * from StuInfo select * from CourseInfo select * from ScoreInfo --分组 ...

  7. vue2 — vuex状态管理

    一.为什么使用vuex : https://www.cnblogs.com/goloving/p/9080005.html vuex的功能 和 localstorage 的作用是一样,把数据在一个所有 ...

  8. Linux命令 uname

    1.简介 管理系统而使用的命令,用于显示系统信息(不同linux版本可能有写差异) 2.语法 uname [-amnrsv] (1) -a,--all 显示所有的信息 (2) -s,--kernel- ...

  9. 为什么对象被new 以后在执行dup操作?

    为什么对象被new 以后在执行dup操作? 今天有个朋友问我,为什么一个new一个对象的指令在new后面紧跟的是dup操作?他说搜了可能找到的 搜索引擎都找不到答案,包括翻了<<深入JAV ...

  10. Spring JDBC FOUND_ROWS 安全吗?

    在很多分页的程序中都这样写: SELECT COUNT(*) from `table` WHERE ......;  查出符合条件的记录总数 SELECT * FROM `table` WHERE . ...