计算机基础——进制与数据编码

Posted 妙先生学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机基础——进制与数据编码相关的知识,希望对你有一定的参考价值。

前言

进制和数据编码是程序员都应该了解的一项基本知识,数据编码和进制解决了计算机存储各种数据(数字、文本、图片、视频等等)的问题。这里我将简单介绍这两方面知识。

ps:这篇文章是我在完成C1之后写的一篇知识总结,由于篇幅原因,进制转换部分我仅仅介绍了一部分。讲解例子也是大多围绕C1任务。

基础知识

3、6、10、55、369、1574······这些我们从小学就接触的数字(更准确的说,常见的十进制数字)每一个数字都有相应的数位
number
对于这样一个数,我们可以使用多项式的方式来表示:
1547 = 1*103 + 5*102+7*101+4*100biaoshi
如果将1547从右往左从零开始编号,可以发现,10的指数就是该编号
总结一下,这种表示方式就是数字的每一位 * 10n,其中n是该数字所在位的编号。这里引出两个概念

  • 基数:10
  • 阶码:3,2,1,0(绿色)
  • 位权:103,102,101,100
    位权
    这是我们最常见的十进制数。但是在计算机中,我们常常使用二进制、八进制、十六进制来表示一个数字。
    例如:1547 = 60B=3013O=11000001011H
    在这里插入图片描述

进制

什么是进制

进制,即进位计数制,又称位置计数法,英文名为system of numeration,是一种人为定义的计数方法

进制的分类

根据基数的不同,分为二进制、八进制、十进制、十六进制。
(当然,这些进制只是比较常见的进制,还可以有3进制、5进制等)

进制
二进制
八进制
十进制
十六进制

进制的表示

1.加脚码

相应的进制加相应的脚码。如:二进制使用2,八进制使用8等
十进制可以加脚码10,但是一般都是省略的

十进制:110 / (110)10
二进制:(110)2
八进制:(110)8
十六进制:(110)16
2.加字母

有的时候我们常常在数字的后面加相应的字母来表示该数字使用的进制
二进制(binary)在数字后面+B
八进制(octal)在数字后面+O
十六进制(hexadecimal)在数字后面+H
十进制(decimal)可以在数字后面+D,但是一般省略

十进制:110 / 110D
二进制:110B
八进制:110O
十六进制:110H

进制转换

不同的进制之间可以进行转换,在任务中,只涉及到二进制小数转十进制,和二进制转十六进制,我这里先简单的介绍这两种转换

二进制转十六进制

二进制与八进制、十六进制的关系(了解)

毫无疑问的是,计算机使用二进制对数据进行表示和存储。但是二进制数太长,不容易阅读和书写,所以引入八进制和十六进制计数系统。
8=23 16= 24,所以8进制数的每一位都对应着3个二进制位;16进制的每一位数都对应着4个二进制位

  • 在二进制转换成十六进制(或八进制)时,我们要从最右边起,每四个当成一组,如果最后一组不足四个,那么我们可以使用0补齐;分好组之后,把每组对应的十六进制数写下来,最终得到的数就是该二进制数所对应的十进制数。

自测一

以110101010001为例,进行说明:

  • 第一步:分组

    注意点:
    1.从最右边开始分组
    2.每四个一组
    2.如果最后一组不足四个,那么我们可以使用0补齐

    fenzu

  • 第二步:将每一组对应的十六进制数写出
    在这里插入图片描述

  • 第三步:得到对应的十六进制数
    所以110101010001B = D51H

二进制小数转十进制

转换原理

  • 小数的转换需要从整数部分小数部分两方面分别进行转换
小数转换
整数部分
小数部分
  • 要对每一位数进行操作每一位数*2n,其中n为数的编码

编码从整数部分的最右边一位从0开始编码,向左递增,向右递增

自测二

问题描述:
101011.101011对应的十进制数是多少?

  • 编码
    在这里插入图片描述

  • 整数部分转换
    101011B = 1*25+0*24+1*23+0*22+1*21+1*20=43

  • 小数部分转换
    0.101011B = 1*2-1+0*2-2+1*2-3+0*2-4+1*2-5+1*2-6=0.671875

  • 结果
    101011.101011B = 43.671875

计算机中图片的表示——用0、1画图

工具

  • https://studio.code.org

简单实现黑白图片

  1. 实现字母
    在这里插入图片描述
  2. 实现汉字
    在这里插入图片描述

浅析计算机存储二进制图片原理

图像文件存储的都是每一个像素对应的颜色值。
1、位图文件有两种存储像素数据的格式。16777216色(真彩色)的图像,一个像素的颜色可以用24位数据表示。256色的图像可以用调色板对颜色的信息进行编码,一个像素的值对应的是调色板的索引,而不是直接对应一个像素的颜色,调色板的索引映射为像素的颜色。
2、以一百万个像素,256种颜色的BMP文件在电脑上的存储为例。这个文件包括一个十四字节的文件首部,一个四十字节的信息首部,一个1024字节的颜色表,一兆字节的位图数据。文件首部的前两个字节由字符BM组成,还包括了文件长度和位图数据在文件中的起始位置。
3、文件的信息首部包含了图像的高、宽、颜色数等非图形数据。这个图像共有一百万个像素,一个像素需要八位的颜色信息,文件的这一部分的长度是一百万个字节,字节排放的顺序是自左到右从图像的最下面那行开始,这个文件的总大小是1001078字节。

作者:Alone
链接:https://www.zhihu.com/question/65771363/answer/391740385
来源:知乎

二进制在游戏方面的体现——植物大战僵尸

工具

  • Windows10操作系统
  • Hex Editor Neo二进制编辑器
  • 植物大战僵尸

准备工作

  • 找到文件存档的存放位置

经过查找,我发现植物大战僵尸的存档文件位置在C:\\ProgramData\\PopCap Games\\PlantsVsZombies\\userdata中。
在这里插入图片描述

  • 找见存档文件位置之后,使用二进制编辑器打开文件
    打开之后发现:这里的users是文件的总文档,里面存储里所有的账号信息;而user1是我创建的游戏账号。所以我们要在use1中修改自己的存储文件
    在这里插入图片描述
    在这里插入图片描述
    接下来我们开始完成一下各部分的功能实现

跳关

在通过一关游戏之后,我发现00000005位置的数字发生了改变。
在这里插入图片描述
于是,我便将数字改为5,发现关卡变成了1-5

注意:这里的数字都是十六进制表示
在这里插入图片描述

所以可以得到00000005就是修改游戏关卡的地方

获得金币

准备——找到商店功能

在该款游戏中,商店是在3-5关才会出现的功能。由于每一个大关卡都只有10个小关卡,所以3-5关实际上是25关
25D = 19B,所以直接调至25关就可以了。
在这里插入图片描述

金币的获得

在这里插入图片描述
这里有400金币,我注意到00000008位置有一个28,(28H = 40D)所以我可以得出00000008处就是修改金币的位置,同时这里每增加1,金币会增加10。

解锁迷你模式

迷你模式的解锁位置在00000300处。这里为1表示迷你模式解锁,0表示迷你模式未解锁。
在这里插入图片描述

解锁生存模式

生存模式的解锁位置在0000000c处,这里解锁之后,该游戏的其他所有模式以及功能也都会解锁
在这里插入图片描述

其他游戏道具的位置

在这里插入图片描述

计算机中的字符集

    • 字符集也称编码集,是为了方便计算机识别各个国家的文字,而引入的。
  • 通过将”编码----文字“一一对应,形成一张编码表

常见的字符集

  • ASCII:美国标准信息交换码
    • 7位表示
  • ISO8859-1:拉丁码表,欧洲码表
    • 8位表示
  • GB2312:
    • 中国的中文编码表,最多两个字节编码所有字符
      • 对于拼音还是使用ASCII进行表示,所以,对于拼音,使用一个字节表示
      • 最高位为1,该字符用两个字节存储;最高位为0,该字符用一个字节存储
  • GBK
    • 中国的中文编码表升级版,融合了更多的中文文字符号。最多两个字符编码
  • Unicode:国际标准码。融合了目前人类使用的所有字符,为每个字符分配了唯一的字符码。所有的文字都用两个字节来表示。
    • Unicode的缺陷:
      • 无法判断字符所存储的字节数
      • 如果和GBK等双字节编码方式一样,用最高位0、1区分字符存储的字节数,则会减少Unicode所能表示的字符数量
  • UTF-8:变长的编码方式,可用1-4字节表示一个字符
    • UTF(UCS Transfer Format)
    • 中文字符用3个字符存储
    • 其他的实现UTF的编码表
      • UTF-16
      • UTF-32

自测三

问题描述

UTF8三字节的编码方式为∶1110xxxx 10xxxxxx 10xxxxxx,汉字【中】的Unicode编码十六进制值是Ox4e2d,Unicode编码按三字节编码转换到十六进制的UTF8编码的计算过程是什么?

问题分析

  1. 【中】的十六进制是Ox4e2d,而UTF-8存储时是用3,所以首先把4e2d转换为相应的二进制形式
    在这里插入图片描述
    至此,得到Ox4e2d的二进制形式0100111000101101
  2. 把这串二进制数字按照utf-8的编码方式进行编码可以得到
    【中】在utf-8中的编码为:11100100 10111000 10101101

其他自测题

  1. 如果要提供一个实时的流媒体服务器,除了ffmpeg,还要提供什么?

还需要提供ffserver

  1. 一个尺寸为8*8大小的png全黑图片前四个字节的十六进制值是什么?
    89 50 4e 47

以上是关于计算机基础——进制与数据编码的主要内容,如果未能解决你的问题,请参考以下文章

Python基础 二进制和字符编码

软考重点1 计算机内数据表示及编码基础

软考重点1 计算机内数据表示及编码基础

初级程序员软考重点1 计算机内数据表示及编码基础

计算机基础知识-- 进制和编码

python基础知识之字符编码