逆向基础--编码(001)
一.位与字节
比特(Bit):1比特就是1位,每个0或1就是一个位,位是数据存储的最小单位。位是二进制表示,8位二进制是一个字节。 8位二进制(就是8个比特)最大:11111111
字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
1个字节等于8位二进制, 8位二进制可存储从00000000到11111111的256个不同的值中的一个。也就是可以存储整数:0~256,以及 -128到127(含)的有符号数字。
可以理解为字节是容器,一个容器有8个格子,每个格子存放一个bit (0和1)
二.字符编码
字符编码包括: ASCII编码和Unicode编码
ASCII编码:使用一个字节(8bit)来表示一个字符,但实际上只使用了7位,共128个字符。包括英文字母、数字、标点符号和控制字符。由于ASCII只能表示128个字符,对于其他语言的字符无法表示,因此出现了多种扩展的字符集(如ISO-8859-1)和Unicode。
Unicode是一个旨在包含所有字符的字符集。如UTF-8、UTF-16、UTF-32。
UTF-8:是一种变长编码,使用1到4个字节来表示一个字符。英文字符在UTF-8中仍然用一个字节表示,与ASCII兼容。而中文等其他字符则用多个字节。
UTF-16:使用2个或4个字节来表示一个字符。
UTF-32:固定使用4个字节表示一个字符。
计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据。
字符【A】的转换示例字符'A'在UTF-8编码下是一个字节,且与ASCII相同,其十六进制为0x41。 现在要将0x41转换成二进制。4和1分别对应4位二进制: 4 -> 0100 1 -> 0001 所以字符【A】的16进制为0x41, 转为二进制就是 01000001。
字符【中】的转换示例分二种编码:Unicode和UTF-8Unicode: U+4E2D (等于0x4E2D) 4E2D (十六进制) = 0100 1110 0010 1101 (二进制,共15位,我们将其扩展为16位,即两个字节) U+4E2D的二进制表示是:100111000101101(15位),但通常我们按16位处理,即前面补0,成为:0100111000101101。UTF-8编码: 11100100 10111000 10101101 (二进制,属于三个字节) 三个字节分别转十六进制: E4 B8 AD 实际存储,这三个字节连续存储: 111001001011100010101101
在Unicode中,码点通常表示为 U+XXXX 的形式,其中XXXX是十六进制数字。这种表示法是Unicode标准约定的。而在编程语言或内存地址中,我们通常使用0x作为十六进制的前缀
为什么Unicode码点用U+开头?
---这是Unicode标准规定的写法,用于明确表示这是一个Unicode码点。它直接告诉我们这个数字是Unicode字符的编号。
为什么字符【中】的16进制为4E2D?
---Unicode码点的分配是有规律的,汉字集中在U+4E00到U+9FFF这个区间(称为CJK统一汉字)。'中'这个字位于这个区间内,具体是U+4E2D。
用户输入: '中' -->应用程序: 识别为 Unicode 字符-->操作系统: 查找 Unicode 码点表 → U+4E2D-->转为字节-->存储或传输
三.转换关系
字节--->16进制
示例字节:11100100 二进制: 1110 0100 十六进制: E 4 结果为:E4
16进制-->字节 十六进制OxE4 转为二进制:1110 0100 (E对应1110 4对应0100) 字节结果为:11100100
四.前缀约定
3.1不同领域的十六进制前缀约定
| 领域 | 前缀 | 示例 | 说明 |
|---|---|---|---|
| 编程语言 | 0x |
0x4E2D |
C/C++/Java/Python等语言标准 |
| Unicode标准 | U+ |
U+4E2D |
Unicode码点的专用表示法 |
| 汇编语言 | h后缀 |
4E2Dh |
某些汇编器的约定 |
| 通用表示 | 无或# |
4E2D 或 #4E2D |
文档或通用场景 |
3.2不同领域的二进制约定
| 领域 | 前缀/后缀 | 示例 | 说明 |
|---|---|---|---|
| 现代编程语言 | 0b 或 0B |
0b1010 |
C++14+, Java 7+, Python, Rust, Go |
| 传统编程语言 | 无标准表示 | B"1010" |
需要库函数或特殊语法 |
| 汇编语言 | b 后缀 |
1010b |
MASM, NASM, 部分汇编器 |
| 汇编语言(其他) | % 前缀 |
%1010 |
某些汇编器变体 |
| Verilog/VHDL | 'b 前缀 |
8'b1010_1100 |
硬件描述语言 |
| 文档/教科书 | 下标₂ | 1010₂ |
学术论文、教材 |
| 网络协议 | 无前缀 | 10101100 |
RFC文档、协议规范 |
| 配置文件 | 无标准 | 多种形式 | 依具体软件而定 |
注意:0x是一个前缀,表示后面跟着的数字是十六进制数。如:0x41
0b 或 0B是一个前缀,表示二进制。如:0b01000001
0 是一个前缀,表示八进制。如:041
十进制是没有前缀的
HTML实体:中(十六进制)或 中(十进制)
CSS Unicode:\4E2D(十六进制)
XML:中(十六进制)
作者:花阴偷移
出处:https://www.cnblogs.com/MrHSR/
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949088.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!