关于c#:转义编码和加密

54次阅读

共计 5160 个字符,预计需要花费 13 分钟才能阅读完成。

本义、编码和加密是开发中很常见也很根底的概念。对于初学开发的开发者,可能有时会无奈精确的辨别着几个词。咱们将通过这篇文章来理解一下“本义、编码和加密”这几个词的关联和区别。

本义

第一种本义场景

绝大多数的开发者都已经在本人学习第一个编程语言时,就遇到了这个概念。以经典的 C 语言中字符串中的字符本义为例。

如果在一个字符串中存在一个 ",那么就须要在" 前增加 \ 才可能失常的示意,比方上面这样。

char* universal_law = "月老板说:\" 世界上本也不存在 '银弹'。一套框架解决不了所有问题。\""

之所以须要这样,是因为对于字符串来说,"自身就是示意一个字符串的起止符号。如果不进行本义,那么编译器将无奈正确的辨认其中的 " 哪些是分隔符,哪些是字符串外部的"

所以,第一种须要本义的场景就是:如果不进行本义就可能与语法规定的某些内容产生混同,所以这些内容都被设计为须要本义。

基于这种场景,能够在很多的编程语言和概念中找到这种场景的体现:

  • java

    String honor = "月老板 -\" 赛博坦首席技术官 \"";

    " 进行本义

  • C#

    var proverbs = "月老板:\" 这里不要写死,下次需要必改 \"";

    " 进行本义

  • XML

    <nb> 月老板的衬衫价格 &gt;99 磅 6 便士 </nb>

    &gt;是对 > 的本义,>是 XML 的边界符

  • 正则表达式

    \d+\\\.\d+

    \.示意一个 .,因为在正则表达式中. 示意匹配除 \n\r之外的任何单个字符。
    \\示意一个\,转义字符的本义示意。

可发帖可群聊的技术交换形式曾经上线,欢送通过链接,退出咱们一起探讨。https://www.newbe.pro/links/

第二种本义场景

当然,另外还有一种场景,同样还是以 C 语言为例,看一下上面这个例子:

char* hammurabi_no1 = "月落大佬:\" 业务复杂度不会因为零碎设计变动而缩小,\r\n 它只是从一个中央转移到了另外的中央。\""

其中的 \r\n也是一种本义场景的应用。他们别离示意一个回车符和换行符。之所以要本义,是因为失常状况下,这样的字符是不可见的,对于这种字符,不过不采纳本义的模式进行表白,那么会比拟艰难,因为语言设计者设计了这种本义的形式来表白不容易表白的字符。

因而,能够总结出第二种须要本义的场景:本义能够使得表白内容的形式更加容易,更加容易了解,所以设计了这类本义规定。

基于这种场景,也能够在很多编程语言和概念中找到对应的体现:

  • C#

    var colorOfYueluoShirt = 0xFFFFFF;

    0xFFFFFF示意一个十六进制数,对应的十进制数是 16777215。0xFFFFFF的表达形式更容易浏览。

  • HTML

    <nb> 月老板的衬衫价格 &gt;966&yen;</nb>

    &yen;是对 的本义,因为在期初的 HTML 中,只能用 ASCII 表中的字符进行表白,所以过后设计了这种形式。

除了在 IT 畛域,在其余畛域其实也存在相似第二场景的利用。例如在中国的航空畛域,对于数字的念法有非凡的解决:7 读作拐,0 读作洞,1 读作幺,2 读作两。通过这样的“本义”解决,能够防止误听而造成的困扰。

本义的总结

总结来说,本义规定的设计,次要解决了两种场景下对代码的表白问题:

  1. 如果不进行本义就可能与语法规定的某些内容产生混同,所以这些内容都被设计为须要本义。
  2. 本义能够使得表白内容的形式更加容易,更加容易了解,所以设计了这类本义规定。

值得一提的是,很多名称中蕴含有 escape 或者 unescape 的函数或者办法都表明了它们与本义无关。

编码

编码也是一个十分常见的概念。比方常常会听到 UTF8 编码、GBK 编码、Base64 编码、URL 编码、HTML 编码、摩斯电码等等一些和编码无关的概念。

生活化地了解编码

在理解编码之前,首先通过一个生活化的例子来理解一下“什么是信息,什么是信息的载体”。

全世界,对于“我爱你”这样一句话的表达方式千差万别。口头表白,书面表白,肢体表白,普通话表白,英语表白,音乐表白,绘画表白。甚至有生之年咱们能够脑电波表白。但不管表达方式是如何的,其中蕴含的信息能够是统一的。都是为了传播“我爱你”这样的一个外围价值。

在以上这段表述中,能够将“我爱你”这样的概念了解为“信息”。而各种表达方式了解为这个信息的各种载体。

那么,回到编程的世界中来。计算机中的信息次要的载体是以电磁信号的物理载体存在于计算机世界中。那么如果要将事实世界简单的内容都依附这种载体来表白,就须要进行转化,咱们能够将这种转化了解为编码。联合前文生活化的例子,应用普通话来表白“我爱你”这个信息,就能够了解为应用普通话来编码这个信息。

因而,编码,其能够了解为,采纳一种新的载体来示意前一个载体所表白的信息。

能够套用相似这样一个公式来了解:XX 编码,将 A 编码为 B,以实现通过 B 进行存储或传输传输的目标。

技术相干的编码

那么,采纳这样的概念,咱们来了解一下以往见到的各种技术概念:

  • 文本文件编码,将“文本数据”编码为“二进制数据”,以实现通过“二进制数据”进行存储或者传输的目标

    文本文件在计算机中,最终的载体是二进制文件的模式存在。早起,因为计算机诞生在美国,文本内容也只蕴含有英文内容。因而过后只有应用 ASCII 进行编码就能够了。然而起初随着计算机的遍及,须要表白的信息越来越多了。因而诞生了 Unicode、GB2312 等等编码模式。但不论如何,这些编码其实都是对文本信息的编码模式。

  • Base64 编码,将“二进制数据”编码为“64 个可打印字符的组合”,以实现通过“可打印字符的模式”进行存储或者传输的目标

    在 Web 场景中,在有些中央限度了数据传输的形式。例如,在 URL,只能传递文本。因而,如果想要传输一组二进制数据。那么能够选用 Base64 编码,将二进制数据编码为可打印的字符串。这样能力实现 URL 上二进制数据的传输。

  • URL 编码,将“非数字字母字符”编码为“十六进制转义序列”,以实现通过“十六进制转义序列”进行传输的目标

    如果须要在 URL 中传递中文作为参数,或者须要在 URL 中传递空格、&?=等等特殊符号。这个时候就须要进行 URL 编码。例如 月老板 会被编码为%E6%9C%88%E8%80%81%E6%9D%BF。编码的目标 HTTP 协定的外在要求,通过这种模式,能够浏览器表单数据的打包。

总的来说,通过编码,能够转化信息表白的载体。这样就能够利用新载体带来的益处。这里也有一些生活化的例子:

  • 摩斯电码,将“文本数据”编码为“点横组成的电信号”,以实现通过“电报”进行传输的目标。

    例如:

    -·-- ··- · ·-·· ··- ---   ·· ···   - ···· ·   -- --- ··· -   ··-· ·- -- --- ··- ···   -·· ·- ·-·· ·- ---
  • 社会主义外围价值观编码,将“文本数据”编码为“社会主义外围价值观组成的字符”,以实现通过“社会主义外围价值观”进行传输的目标。

    例如:

    诚信自在公正敬业友善公正爱国爱国友善爱国爱国爱国富强爱国专制友善爱国公正敬业诚信谐和诚信专制友善敬业友善爱国公正诚信专制富强诚信专制爱国友善爱国爱国诚信专制友善敬业敬业诚信文化友善爱国公正敬业爱国诚信富强诚信平等诚信自在公正敬业诚信文化爱国富强诚信自在平等诚信专制友善公正诚信专制友善自在诚信自在法治敬业友善自在爱国自在

    社会主义外围价值观编码工具:http://www.atoolbox.net/Tool….

值得一提的是,很多名称中蕴含有 encode 或者 decode 的函数或者办法都表明了它们与编码无关。

什么是乱码

依据上文提到的公式,编码是实现 A->B 的载体转化过程。那么同样能够定义 A->B 的逆过程 B->A 为“解码”。

个别,如果解码之后无奈正确还原原来 A 所表白的信息,咱们会说呈现了乱码。例如,应用 GB2312 的形式去解码一个 UTF8 编码的文件,那么就会呈现乱码。

当然,更加常见的状况是,当开发者,特地是初入的新晋工程师,看到本人无奈了解的文本,就说:“这是乱码。”

总的来说,乱码通常来说只是因为选用的解码形式和编码方式不同,而导致信息失真的状况。选用正确的编码就可能解读出正确的信息。

加密

加密很好了解,在日常生活中也不乏加密的应用场景。特地是在以前的和平中的无线电技术利用历史中,确保己方军事信息不被敌方破解,采纳优良的加密算法是极为重要的军事内容。

加密,能够这样概括:依照肯定的算法,将须要表白的信息进行解决,以达到除了信息的发送者和接收者之外,其他人无奈辨认信息实在内容的目标。

技术上,有须要应用加密的场景:

  • HTTPS,平安的 HTTP 通信通道,通过加密算法来确保浏览器接管到的数据没有被篡改,未被泄露
  • SSH,为建设在应用层根底上的平安协定。SSH 是较牢靠,专为近程登录会话和其余网络服务提供安全性的协定。利用 SSH 协定能够无效避免远程管理过程中的信息泄露问题。
  • SSR。SSR 是各种集换式卡牌游戏中,卡牌罕见度级别分类的一种。(大雾)

这里须要特地说的是编码和加密的区别和分割:

  • 编码的目标是为了转换信息的载体,使得转换后的载体更好传输或者存储。然而加密是为了平安,避免被辨认。
  • 加密须要一个或者一份密钥进行加密和解密解决。平安是加密算法,在没有密钥的状况下,简直不可能被破解。然而编码并不需要密钥。

所以要简略辨别是编码还是加密,能够简略套用这个了解:在算法齐全公开的状况下,如果还须要密钥,那么是加密。如果不须要密钥,只能算是编码。

联合生存例子了解一下加密和编码的区别:存在这样一段字符串 Мистер Мун, Навсегда Бог. 这并不是加密,因为这是一段失常的俄语。不能因为看不懂就说他是加密,因为如果懂俄语,会用俄语解码这段信息,就能晓得他表白的意思是:“月学生,永远的神”。

值得一提的是,很多名称中蕴含有 encrypt 或者 decrypt 的函数或者办法都表明了它们与加密无关。

可发帖可群聊的技术交换形式曾经上线,欢送通过链接,退出咱们一起探讨。https://www.newbe.pro/links/

下饭小测

以下是对于本文章的一些概念的测试题,以便读者更好的了解。

不用放心这些语言你没有学过,因为概念其实和语言关系不大。

所有的问题都只有三个选项:

  1. 本义
  2. 编码
  3. 加密

小测 1

在很多编程语言中都存在“字符串内插”的语法,例如:C#、ES6、Powershell。

以 C# 为例,以下就是一个示例:

var dalao = "月落大佬";
var hammurabi_no1 = $@"{dalao}:"" 业务复杂度不会因为零碎设计变动而缩小,它只是从一个中央转移到了另外的中央。""";
Console.WriteLine(hammurabi_no1);

那么,以上代码中 "" 输入时只示意一个",这是(A)解决。

如果须要在 $@ 结尾的“多行字符串内插”字符串中,输入一个 },那么须要应用}} 来进行(B)解决。

A:本义

B:本义

小测 2

在 Powershell 中如果要定义一个多行字符串变量,那么须要采纳上面这样的写法:

$template = @"
## [version]

[content]

"@

那么,如果须要在这个字符串中插入一个 @ 或者 ",能够间接写进去,因为 powershell 是应用@""@,作为多行字符串的起止符,而且要求起止符须要单行。因而两头呈现的 @#都不须要进行(A)解决。

A:本义

小测 3

在 javascript 中有一个函数名称为 escape。依照 MDN 的解释,该函数曾经被标记为弃用了。倡议应用 encodeURI 和 encodeURIComponent 代替。从相应的函数解释上也能够看出,原来的escape 是进行表白的意思是进行(A)解决。或者就是大佬们意识到这个名字其实不对,所以换了函数?新函数看名字间接了解应该是对 URI 进行(B)解决,仿佛更加精确哟。

A:本义

B:编码

小测 4

已经有的网站应用 base64 的形式,解决登录票据,并且保留在 Cookie 中。只管这仿佛比明文保留要高超一点,但这是不平安的,因为 base64 只是一种(A)算法,不可能平安的避免信息被篡改。能够选用例如 DES 这样的(B)算法,来确保信息不被篡改。

A:编码

B:加密

总结

本义、编码和加密都是在开发过程中经常遇到的概念。留神辨别学习,进行正确的表白可能更好沟通。

感谢您的浏览,如果您感觉本文有用,请点赞、关注和转发。

可发帖可群聊的技术交换形式曾经上线,欢送通过链接,退出咱们一起探讨。https://www.newbe.pro/links/

  • 本文作者:newbe36524
  • 本文链接:https://www.newbe.pro/Others/0x01C-escape-encoding-and-encryption/
  • 版权申明:本博客所有文章除特地申明外,均采纳 BY-NC-SA 许可协定。转载请注明出处!

正文完
 0