今天突然被问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. 转载 Struts2之------Action类中的get,set方法和execute方法的使用规范和使用流程(规范是没有理由的,必须遵守!!!)

    1,Action中get,set方法的使用流程? 前台form中有一个<input type="text" name="username"/> 如果 ...

  2. css实现下拉框导航条

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  3. shell 提取文件的某行,并在行尾添加字符

    sed -n '100,200p' file.txt #提取文件file.txt第100行到第200行的内容 sed 's/$/test/' file.txt #在行尾添加字符串test,$代表行尾

  4. spring boot2.x集成spring security5与druid1.1.13(一)

    版本:         spring boot 2.1.2.RELEASE         druid-spring-boot-starter 1.1.13 步骤:        一.maven    ...

  5. Dart 和 Flutter 使用json_annotation和json_serializable来处理json数据教程

    在学习fultter的时候突然想到如何去处理从服务器获取的json或者将app中的对象数据转换成json上传给服务器 于是研究一下dart对json数据的处理 首先需要依赖下面的第三方库(这里要强调下 ...

  6. Nginx功能模块汇总

    主要文档 Nginx功能概述.为什么选择Nginx.Nginx安装.常见问题(FAQ).配置符号参考.调试 nginx.优化 Nginx.运行和控制Nginx 核心模块 Nginx事件模块.Nginx ...

  7. python 100day notes (1)

    x1 + x2 +x3 + x4 = 8 多少正整数解 上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案 即用三个隔板插7个空位. 答案C(7,3) =35 # __name__是Pyt ...

  8. js千位符 | js 千位分隔符 | js 金额格式化

    js 千位分隔符 千位分隔符,其实就是数字中的逗号.依西方的习惯,人们在数字中加进一个符号,以免因数字位数太多而难以看出它的值.所以人们在数字中,每隔三位数加进一个逗号,也就是千位分隔符,以便更加容易 ...

  9. 监控软件munin安装设置

    准备工作需要web环境需要设置epel源 wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-6.repo 服务器端安装设置 y ...

  10. js 中 !!的用法

    !!是将表达式强制转化为bool值的运算,运算结果为true或false,表达式是什么值,结果就是对应的bool值,不再取非. 不是取非再取非的意思!!! !!false=false;    要注意f ...