如何储存数据

344 阅读5分钟

数字储存方式--存二进制

十进制转二进制即可

二进制

31 变成二进制

经过一番尝试

所以 31(十进制) = 01 1111(二进制)

十六进制

一般用十六进制表示二进制(因为二进制写起来太慢了)

方法一

  1. 二进制数:011110001011010
  2. 记住8421对应XXXX
  3. 从右往左每四位改写成一位:011 1100 0101 1010
  4. 得到3,12,5,10
  5. 把大于9的数字改为ABCDEF
  6. 于是得到3C5

方法二

用计算机的程序员模式

HEX表示16进制, DEC表示10进制, OCT表示8进制, BIN表示2进制

字符储存方式--字符编码--存编码

英文编号(ASCII 码

编码方式:先把这128个字符按照顺序给它一个十进制数字(从0到127)来编号,如下图。

然后储存时便会把这些字符的十进制数字变成二进制数字储存

  • 一个16进制数是4个0/1位
  • 0表示结束字符
  • 10表示换行
  • 13表示回车
  • 32(二进制00100000)表示空格
  • 33到47表示标点
  • 48到57表示数字符号
  • 49(二进制00110001)是数字符号1
  • 65到90表示大写字母
  • 65(二进制01000001)是大写的字母A
  • 97到122表示小写字母
  • 97(二进制01100001)是小写字母a
  • 127表示删除键(二进制01111111)

中文编号(GB2313)

用 0000~FFFF 表示汉字

编码方式:用16进制(从0000到FFFF)来编号。占用两个字节。然后储存时便会把这些十六进制数字变成二进制数字储存

  • 一个16进制数是4个0/1位
  • FFFF就是4x4=16位,也就是两个字节
  • 最多收录 2^16 = 65536 个字符
  • 但只收录了 6000 多汉字、西文字母和日文假名

「你」的 GB2312 编号为 C4E3

「牛」的 GB2312 编号为 C5A3

国标扩(GBK)

编码方式:同GB2312,用16进制(从0000到FFFF)来编号。占用两个字节。然后储存时便会把这些十六进制数字变成二进制数字储存

  • 含21886个汉字和图形符号
  • 收录了中日韩使用的几乎所有汉字
  • 完全兼容 GB2312
  • 依然使用 16 位(两字节)
  • 后来国标局推出 GB18030 取代 GBK GB18030 不兼容 GB2312

万国码(Unicode)

  1. 将世界上所有的符号都纳入其中的一个字符集,已收录13万字符(大于16位),全世界通用。而且一直在更新中。
  2. 每个字符占三个及以上字节。所以很占内存。
  3. 字符编码UTF-8
(1) Unicode 的实现方式之一。

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

(3)这样就节省了不必要使用的空间

(4)UTF-8中8是指最少可用8位,也就是一个字节,来存一个字符

(5)例如存储「a」

  • a对应的Unicode编号为97,十六进制为61
  • Unicode直接存:00000000 00000000 01100001
  • UTF- 8偷懒存法:01100001
  • 三字节变一字节,比GBK还省

(6)例如存储「你」

  • 你对应的Unicode编号为4F60
  • Unicode直接存:00000000 01001111 01100000
  • UTF-8偷懒存法:11100100 10111101 10100000
  • 还是三字节,汉字似乎没有省,但是字母都能省一点

(7)UTF-8 的编码规则很简单,只有二条:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

(8)举例:以「你a」为例 (7)UTF-8 的编码规则很简单,只有二条:

    11100100 10111101 10100000 01100001
  • 读8位信息11100100
  • 发现开头有3个1,说明这个字符有3个八位
  • 于是再读两个8位信息10111101 10100000
  • 前面的10不要,其他合起来,得01001111 01100000
  • 这就还原为Unicode的你了:00000000 01001111 01100000
  • 再读8位信息01100001
  • 发现开头是0,说明这个字符只占8位
  • 这就还原味Unicode的a了:000000000000000001100001

问题

最后都是都是存数字0101010101,计算机咋知道你存的是数字的010101还是字符的01010101

答:计算机不知道。需要我们用一些辅助方式提醒计算机,比如加后缀(.txt就是存字符的编码,Excel就是存数字的数字)