.NET 编码的一些基本概念和分析

简单的类型概念

  • Hex (16进制)
  • byte 字节 范围是:0~255,二进制下的范围就是00000000~11111111,相当于1字节。
  • byte[] 字节数组
  • bit 比特,只有2种状态:0,1

1 字节 等于 8 比特1byte=8bit

在c#中。Byte即byte,他是一个struct结构体,

b1等于b2.

byte b = 1;
byte b1 = 0xf;//以0x开头 即16进制的写法
byte b2 = 15;
Assert.Equal(b1, b2);

错误的语法

byte b3 = b1 + b2;

正确的语法

byte b3 = (byte)(b1 + b2);
//或
int b4 = b1 + b2;

因为byte的相互运算太容易发生溢出,+ 加的重载 是int类型相加,所以结果是int类型

Encoding.UTF8.GetBytes

UTF8是统一的编码方式,它是一种变长的编码方式.它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度

byte[] plaintext = Encoding.UTF8.GetBytes("0123456789");

能得到什么样的数据,48,49,50,51,52,53,54,55,56,57。为什么?

搜ASCII码,我们就知道 0的ASCII码是 48

如果是字母呢。

byte[] plaintext = Encoding.UTF8.GetBytes("ABCDabcd");

能得到什么样的数据,65,66,67,68,97,98,99,100。为什么?还是因为ASCII码。UTF8当然是兼容ASCII码。

因为一个ASCII码,1个字节就能表示256个状态,所以英文字母,阿拉伯数字,标点符号都不在话,哪如果是中文呢。这里我们就拿UTF8编码来分析。

byte[]   plaintext = Encoding.UTF8.GetBytes("中国");

如下内容,长度为6,228,184,173 都是十进制。如果转成16进制呢。e4,b8,ad,如果分不清十六进制,建议学一下,计算机系统基础。当然,说明一下,a代表10e即代表14.即14*16+4=228.表示时不区分大小写,即用大写A,和小写a都能表示10

十进制 十六进制
0 228 e4
1 184 b8
2 173 ad
3 229 e5
4 155 9b
5 189 bd

我们从网上搜下,可以发现 中国 的UTF-8编码: E4B8AD E59BBD.说明通过Encoding.UTF8.GetBytes的结果肯定是对的。中文是用3或4个 Bytes存储的。

1.byte[] 转换hex(16进制字符串)

  1. Encoding.UTF8.GetBytes能得到数据的十进制的字节数组。
  2. BitConverter.ToString支持将十进制的数据转换成16进制,中间以-分隔,所以需要将中间的- Replace
public string ByteToHex(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
string hex = BitConverter.ToString(bytes, 0).Replace("-", string.Empty);
return hex;
}

hex得到 的数据就是 E4B8ADE59BBD

 string hex= ByteToHex("中国");

2.byte[] 转换hex:StringBuilder方式

如下内容为什么能将数据转成16进制.

  1. Encoding.UTF8.GetBytes能得到数据的十进制的字节数组。
  2. 利用c#中的 复合格式化特性 {0:X2}自动转换成16进制。同样内容支持Console.WriteLine等
public string ByteToHex2(string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
StringBuilder ret = new StringBuilder();
foreach (byte b in bytes)
{
//{0:x2} 小写
ret.AppendFormat("{0:X2}", b);
}
return ret.ToString();
}

hex(16进制字符串)转换 byte[]

  1. 一个循环将16进制转换成10进制。
public byte[] HexToByte(string hex)
{
byte[] inputByteArray = new byte[hex.Length / 2];
for (var x = 0; x < inputByteArray.Length; x++)
{
var i = Convert.ToInt32(hex.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
return inputByteArray;
}

调用如下内容,bytes[]中的长度为6,数据是228,184,173、229,155,189。即上文中的中国的十进制byte数组

string hexChinese = "E4B8ADE59BBD";//中国的UTF8编码。十六进制。
byte[] bytes = HexToByte(hexChinese);
string text = Encoding.UTF8.GetString(bytes);// `中国`

.NET 编码的基础知识的更多相关文章

  1. 学习电脑编码utf-8,ansi编码的基础知识等

    大学时期就很好奇,我们所看到的文字在电脑里面是怎么记忆的,感觉不可能是文字本身,今天刚好学习java的io流知识,顺便补充了一下电脑编码知识,先看一下下面小王和小张的例子,然后思考电脑怎么存放文字?  ...

  2. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  3. java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**

    原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)—–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...

  4. python基础知识3---字符编码

    阅读目录 一 了解字符编码的知识储备 二 字符编码介绍 三 字符编码应用之文件编辑器 3.1 文本编辑器之nodpad++ 3.2 文本编辑器之pycharm 3.3 文本编辑器之python解释器 ...

  5. VIM字符编码基础知识

    1 字符编码基础知识 字符编码是计算机技术中最基本和最重要的知识之一.如果缺乏相关知识,请自行恶补之.这里仅做最简要的说明. 1.1 字符编码概述 所谓的字符编码,就是对人类发明的每一个文字进行数字 ...

  6. H265编码等级以及图像的基础知识

    1. H265编码等级 H264编码profile & level控制 .H265编码初探 H265 profile H265 Profile & Level & Tier 介 ...

  7. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

  8. selenium自动化基础知识

    什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...

  9. TCP/IP协议(二)tcp/ip基础知识

    今天凌晨时候看书,突然想到一个问题:怎样做到持续学习?然后得出这样一个结论:放弃不必要的社交,控制欲望,克服懒惰... 然后又有了新的问题:学习效率时高时低,状态不好怎么解决?这也是我最近在思考的问题 ...

随机推荐

  1. 隐藏状态栏后tableview自动上移20个像素的问题

    最近在开发过程中碰到一个很奇怪的问题,将状态栏隐藏掉之后,页面上的tableView会自动上移20个像素. 这是因为在iOS7.0之后,系统会自动调整scrollView的layout 和 conte ...

  2. java的bio和nio写入及读取txt文件

    一.bio的写入及读取 1.采用bio之BufferedWriter 写入文件 public static void main(String[] args) throws IOException { ...

  3. 【JAVA今法修真】 第二章 一气化三清 线程分心念

    这是我的微信公众号,希望有兴趣的朋友能够一起交流,也希望能够多多支持新人作者,你的每一份关注都是我写文章的动力:南橘ryc 天有八纪,地分九州,万法仙门与天道剑宗一并坐落在东北方通辽州. 与李小庚想象 ...

  4. Flink Exactly-once 实现原理解析

    关注公众号:大数据技术派,回复"资料",领取1024G资料. 这一课时我们将讲解 Flink "精确一次"的语义实现原理,同时这也是面试的必考点. Flink ...

  5. [Java Web 王者归来]读书笔记2

    第二篇 基础篇 第三章 深入Servlet技术 1 浏览器的request http数据报中包含一些关键信息,如访问方式.所用的http版本.所用的浏览器.当前的页面地址等信息 2 http查询数据方 ...

  6. Mybatis中对象关系映射

    在实际开发中,实体类之间有一对一.一对多.多对多的关系,所以需要正确配置它们对应关系,Mybatis通过配置文件能够从数据库中获取列数据后自动封装成对象. 如:一个订单Orders类对应一个用户Use ...

  7. [ZJCTF 2019]EasyHeap | house of spirit 调试记录

    BUUCTF 上的题目,由于部分环境没有复现,解法是非期望的 house of spirit 第一次接触伪造堆的利用方式,exp 用的是 Pwnki 师傅的,本文为调试记录及心得体会. 逆向分析的过程 ...

  8. CF1092B Teams Forming 题解

    Content 有 \(n\) 个学生,每个学生有一个能力值 \(a_i\).现在想把学生两两分成一组,但是不能让每个组里面的学生能力值不相同,因此可以通过刷题来提升自己的能力值,每次解出一道题,能力 ...

  9. Redis报错:RDB snapshots, but it is currently not able to persist on disk 处理

    Response received : -MISCONF Redis is configured to save RDB snapshots, but it is currently not able ...

  10. Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)

    Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...