ASP.NET Core – Byte, Stream, File 基础


前言

以前的文章:  和 .

这篇主要是做一个整理, 方便要用的时候 warm up.

参考 & 工具:

字符编码笔记:ASCII,Unicode 和 UTF-8

Ascii to Binary

ASCII to 十进制

Unicode, UTF-8 to Binary

基本术语和概念

先过一边基本术语和概念:

Bits

Bits 就是比特. 它是最小的单位, 1 bit = 1 个二进制, 0 或者 1.

通信的时候就是通过电压高低, 来表示 0 或 1. 在由二进制来表达万物 (就好比摩斯密码一样) 

Bytes

Bytes 是字节. 1 byte = 8 bits. 它也是一个单位.

bytes 长这样 00000000 to 11111111, 号码只能是 0 或 1, 所以总的来说, 它有 255 种组合.

1 个字节, 可以表达 255 种不同的状态. 255 种不算很多, 足够 cover 英文字母 + 符号. 但是 cover 不到汉字.

所以我们常听人说, 1个汉字需要 2 个字节来表示, 而 1 个英文字母用 1 个字节就足够了.

Stream

Stream 可以理解为水, 流动的时候像是河流, 静止的时候像是池塘. 

bytes 则是鱼, 所以 stream 里面有许多的 bytes (鱼在水中). 信息通讯就好比这些水和鱼被倒来倒去 (或者流来流去) 

Bytes encode

通信用的是二进制, 那自然是需要 encode 咯, 比如把 0 和 1 变成 alphabet (英文字母). 

1 个 alphabet 需要 1 byte 来表示, 而汉字需要 2 bytes 来表示 (也要依据 encode 手法, 但大概可以这样去理解).

还有很多种 encode 的方式, 比如:

char, char[], string

char 是 C# 中用来装字母的, 1 char = 2 bytes, 所以它也可以装汉字.

char[] 就是很多字母咯.

string 是 char[] 的封装. 它包含了对 char[] 的操作, 比如 char[] 的 length 是不可以变的, 但 string 可以.

小总结

下面这些需要在脑袋里. 往后理解上层的东西就容易了.

bit = 比特 = 二进制(binary) = 0 或者 1

1 bytes (字节) = 8 bits

stream 里面有很多 bytes

bytes 和 alphabet, 汉字之间需要转换 (encode/decode), ASCII (only for alphabet), Unicode (for all language 汉字等), UTF (一种 unicode 的具体实现) 就是转换的规范.

串起来理解 & 运用场景

万物都是二进制

在数码世界里, 万物都是二进制 (bit) 0 或 1 来表示的, 1 个文件它储存在磁盘里也是二进制, 2 台电脑通信传输的依然是二进制, 这就是最底层的逻辑.

二进制如果表达万物?

0 和 1 对电脑来说 ok, 对人来说可不行, 所以需要转换. 二进制转换成英文字母, 汉字是有规范的, 这就是所谓的 ASCII, Unicode, UTF, 等等.

运用场景

1. 前端 upload file, 后端保存文件. 

2. download from http client 保存文件

3. 读取 file 发 email. 

4. read text from file (比如 json)

5. append text to file (比如 log)

场景虽然多, 但是需要掌握的技术其实不多. 

不管是前端 upload file, 还是 download from http. 都会先拿到 memory stream, 里面自然就是 bytes 咯.

如果只是拿来 save to file, 或者 发 email, 通常直接把 stream 转交出去就可以了. 不需要 convert.

如果是要进行读写, 那么通常就需要做 convert. 总不能直接改二进制吧...

String to Bytes

光看不练, 很难明白细节的, 我们来徒手做一遍.

先来把一个字符串转成 bytes. 看看是怎样的.

var value = "Hello World";
var bytes = Encoding.UTF-8.GetBytes(value);

Hello World 字母被转换成了 11 个 bytes, 第一个字大写 H 的 byte 是 72. 这个是十进制的表示, 它的二进制是 01001000. 

这里几个点一定要搞清楚

1. 字 (英文, 汉字, 什么鬼字) 被转换成 bytes 一定需要一个规范. 比如 UTF-8, ASCII, 不同规范转出来的结果是不一样的哦.

2. UTF-8 转换出来的 bytes 并不是 Unicode 对哪个字的二进制定义. 而是 UTF-8 对哪个字的二进制定义. 怎么理解? 

比如我的姓 "严". 

UTF-8 的二进制是 11100100 10111000 10100101

UTF-16 的二进制是 0100111000100101

UTF-32 的二进制是 00100101010011100000000000000000

ASP.NET Core Stream 结构

ASP.NET Core build-in 了许多 Class 来处理 Bytes, Stream 这些冬冬. 

Stream(抽象类) > TextReader(抽象类) > StreamReader(实体类) > MemoryStream(实体类), FileStream(实体类) 等等

顾名思义, MemoryStream 是负责缓存的, FileStream 是文件的. 

    

相关