.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. 链式栈——Java实现

    1 package struct; 2 3 //接口 4 interface ILinkStack{ 5 //栈中元素个数(栈大小) 6 int size(); 7 //取栈顶元素 8 Object ...

  2. [学习总结]5、Android的ViewGroup中事件的传递机制(二)

    下面是第一篇的连接 Android的ViewGroup中事件的传递机制(一) 关于onInterceptTouchEvent和onTouchEvent的详细解释. 1 public class Mai ...

  3. ES6常用的数值转换方法

    <script type="text/javascript"> // Number常用方法 /* Number.isFinite() 用来检查一个数值是否为有限的(fi ...

  4. ES6 object.defineProperty

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. Object.defineProperty(obj, prop, ...

  5. 35、搜索插入位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(35)搜索插入位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "无视要 ...

  6. 云原生应用管理,像管理手机APP一样管理企业应用

    我们在使用智能手机的时候,手机APP从应用市场一键安装,安装好即点即用,当有新版本一键升级,如果不想用了长按图标删除,整个过程非常简单,小朋友都能熟练掌握.而对于企业应用,由于结构复杂.可用性要求高. ...

  7. Game On Serverless:SAE 助力广州小迈提升微服务研发效能

    作者:洛浩 小迈于 2015 年 1 月成立,是一家致力以数字化领先为优势,实现业务高质量自增长的移动互联网科技公司.始终坚持以用户价值为中心,以数据为驱动,为用户开发丰富的工具应用.休闲游戏.益智. ...

  8. 位置式PID讲解

    table { margin: auto } 一.公式拆解 \(PID\)公式展示: \[u(t)=K_p(e(t)+\frac{1}{T_t } ∫_0^te(t)dt+T_D \frac {de( ...

  9. 通过idea创建Maven项目整合Spring+spring mvc+mybatis

    创建项目 File→new→project             然后就不断next直到项目面板出来 设置文件夹         注意:这里我个人习惯,在java下还建了ssm文件夹,然后再cont ...

  10. Java编程思想—读书笔记(更新中)

    第1章 对象导论 1.4 被隐藏的具体实现 访问控制的原因: 让客户端程序员无法触及他们不应该触及的部分(不是用户解决特定问题所需的接口的一部分) 允许库设计者可以改变类内容的工作方式而不用担心会影响 ...