字符编码与字节流二进制补码形式

一、字符集发展史

 1、前提

字符编码只跟文本数据和字符串有关系,它跟视频文件、音频文件等无关

2、计算机只能识别二进制数,详解如下

 二进制数即由0和1组成的数字,例如010010101010。计算机是基于电工作的,电的特性即高低电平,
人类从逻辑层面将高电平对应为数字1,低电平对应为数字0,这直接决定了计算机可以识别的是由0和1组成的数字

3、发展史

一家独大

计算机最开始是有美国人发明的,他们肯定是想让计算机识别英文字符

ASCII码表:它的内部记录了英文字符和数字之间的关系

ASCII码表内置使用一个字节代表一个字符

# 一个字节等于8位

0000001

2 ** 7 == 128

2 ** 8 == 256

在当初的时候,127种情况足够秒杀当时遇到的所有字符

后面使用8位代表一个字节是为了后续增加字符

需要记忆的是:

A-Z:65-   往后加一
a-z:97-    往后加一
0-9:48-    往后加一

字符串的比较:是按照ASCII码表的十进制数进行比较的
print('hello' > 'world')

群雄割据

中国人要想使用计算机,就自己开发了一套编码表:

GBK码表:国标码,它的内部记录了英文、中文和数字之间的对应关系

你----->129

好------>130

2 ** 16 == 65536

GBK码表使用1个字节保存英文字符,使用2个字节保存中文字符

日本人要想使用计算机,也得发明一套属于自己的编码表

Shift_JIS表

韩国人也要有一套属于自己的编码表

Euc-kr表

一统天下

为了让世界上的所有国家之间能够彼此无障碍的交流,统一使用了编码

unicode(万国码)(在内存中,写文档时,还没保存的时候数据在内存中,依旧能识别中文,是因为内存中有unicode编码)

unicode统一使用两个字节保存字符或者更多字符

由于原来的英文字符是使用一个字节保存的,现在万国码使用了两个字节,所以就把资源浪费了一倍

utf8编码(unicode的优化版本)

utf8中 1个字节保存英文字符,3个字节保存中文字符

最终得出结论:以后在使用字符编码的时候就使用utf8
# 补充:
utf-8、utf-16、utf-32...、utf8mb4(存表情) 

GBK和utf-8编码底层都基于ASCII,所以一个英文字母都是用一个字节表示

二、python中的编码和解码

1、 python解释器代码的差异

在python2中,默认使用的编码是ASCII码

# **-coding:utf-8-**
s = u'你好'
print s

python3中默认使用的是utf8编码

2、编码和解码
编码:是把其他字符串转为二进制的过程

str----->0101
str----->unicode----->0101001
ASCII---->GBK------>unicode----->utf8

解码:把二进制转为其他字符串的过程

s = 'hello你好哈'

编码

res = s.encode('utf8')
# print(res) # b'hello' # 二进制 binary bin()
print(res) # b'hello\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x93\x88'

解码

res1 = res.decode('utf8') # gbk、utf8
print(res1) # hello你好哈

# 补充
s1 =b'hello123' # 只能是纯英文字符
s2='hello123'.encode('utf8')

三、字节流二进制补码形式

1、在计算机世界中数据的传输是0 1 表示法,在0 1 之上可以定义各种传输协议。

2、自定义协议,如一个传输一个16进制的字节流,解析字节流为人类可读数据

rsp_nu_1_no_1 = \
    b"\xe1\x00\x00\x02\x00\x05" \
    b"\x04\x7c\x01\x01\x00\x01\x00\x07\x04\x74\x00\x21\x00\x00\x00\x00" \
    b"\xf1\x3b\x04\x6a\x00\x01\x00\x00\x0e\x7f\xaf\x00\xff\xff\xff\xff" \
    b"\xff\xff\xff\xff\x00\x01\x00\x06\x00\x00\x00\x01\x04\x5a\x00\x00" \
    b"\x00\x0b\x04\x4a\x87\x8c\x00\x09\x00\x5a\x09\x21\x00\x02\x87\x8c" \
    b"\x09\x2f\x00\x04\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00" \
    b"\x00\x01\x42\x28\x00\x00\x00\x00\x09\x24\x00\x04\x00\x02\x4b\x5c" \
    b"\x09\x27\x00\x10\x00\x0e\x00\x53\x00\x70\x00\x4f\x20\x82\x00\x20" \
    b"\x00\x20\x00\x00\x09\x17\x00\x02\x03\x00\x09\x11\x00\x02\x00\x06" \
    b"\xf0\x08\x00\x02\x06\xd1\x09\x50\x00\x0a\x4b\x48\x04\x00\x17\xa0" \
    b"\x00\x00\x00\x25\x86\x3f\x00\x07\x00\x46\x09\x21\x00\x02\x86\x3f" \
    b"\x09\x2f\x00\x04\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00" \
    b"\x00\x01\x42\x28\x00\x00\x00\x00\x09\x24\x00\x04\x00\x02\x58\x04" \
    b"\x09\x27\x00\x10\x00\x0e\x00\x43\x00\x50\x00\x50\x00\x20\x00\x20" \
    b"\x00\x20\x00\x00\x09\x17\x00\x02\x03\x00\x09\x11\x00\x02\x00\x05" \
    b"\x86\x58\x00\x07\x00\x46\x09\x21\x00\x02\x86\x58\x09\x2f\x00\x04" \
    b"\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00\x00\x01\x42\x28" \
    b"\x00\x00\x00\x00\x09\x24\x00\x04\x00\x02\xe0\x18\x09\x27\x00\x10" \
    b"\x00\x0e\x03\x94\x6e\x29\xfe\xff\x5e\xa6\xfe\xff\x00\x20\x00\x00" \
    b"\x09\x17\x00\x02\x03\x01\x09\x11\x00\x02\x00\x02\x87\x8c\x00\x09" \
    b"\x00\x5a\x09\x21\x00\x02\x87\x8c\x09\x2f\x00\x04\x00\x01\x00\x06" \
    b"\x09\x3f\x00\x0c\x00\x00\x20\x00\x00\x01\x42\x28\x00\x00\x00\x00" \
    b"\x09\x24\x00\x04\x00\x02\x4b\xb8\x09\x27\x00\x10\x00\x0e\x00\x53" \
    b"\x00\x70\x00\x4f\x20\x82\x00\x20\x00\x20\x00\x00\x09\x17\x00\x02" \
    b"\x03\x00\x09\x11\x00\x02\x00\x06\xf0\x08\x00\x02\x06\xd1\x09\x50" \
    b"\x00\x0a\x4b\xb8\x04\x00\x02\x20\xff\x00\x03\xb6\x87\x92\x00\x07" \
    b"\x00\x4e\x09\x21\x00\x02\x87\x92\x09\x2f\x00\x04\x00\x01\x00\x06" \
    b"\x09\x3f\x00\x0c\x00\x00\x20\x00\x00\x01\x42\x28\x00\x00\x00\x00" \
    b"\x09\x24\x00\x04\x00\x02\x48\x22\x09\x27\x00\x10\x00\x0e\x81\x09" \
    b"\xfe\xff\x64\x0f\xfe\xff\x00\x20\x00\x20\x00\x00\x09\x11\x00\x02" \
    b"\x00\x06\x09\x50\x00\x0a\x48\x22\x04\x01\x0a\xa0\x00\x00\x00\x3d" \
    b"\x87\x96\x00\x08\x00\x54\x09\x21\x00\x02\x87\x96\x09\x2f\x00\x04" \
    b"\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00\x00\x01\x42\x28" \
    b"\x00\x00\x00\x00\x09\x24\x00\x04\x00\x02\x4b\xb0\x09\x27\x00\x10" \
    b"\x00\x0e\x70\x4c\xfe\xff\x6c\xe8\xfe\xff\x00\x20\x00\x20\x00\x00" \
    b"\x09\x17\x00\x02\x02\x01\x09\x11\x00\x02\x00\x06\x09\x50\x00\x0a" \
    b"\x4b\xb0\x04\x00\x02\x00\xff\x00\x00\x64\x87\xe6\x00\x0a\x00\x82" \
    b"\x09\x21\x00\x02\x87\xe6\x09\x2f\x00\x04\x00\x01\x00\x06\x09\x3f" \
    b"\x00\x0c\x00\x00\x20\x00\x00\x01\x52\x28\x01\x03\x00\x00\x09\x24" \
    b"\x00\x04\x00\x02\x4a\x04\x09\x27\x00\x10\x00\x0e\x00\x4e\x00\x42" \
    b"\x00\x50\x00\x20\x00\x20\x00\x20\x00\x00\x09\x11\x00\x02\x00\x01" \
    b"\x09\x90\x00\x08\x20\x19\x03\x21\x16\x30\x43\x00\xf2\x37\x00\x04" \
    b"\xff\xff\xff\xff\xf9\x98\x00\x04\xff\xff\xff\xff\x09\x4b\x00\x22" \
    b"\x00\x03\x00\x1e\x4a\x05\x04\x00\x0f\x20\x00\x00\x00\x5a\x4a\x06" \
    b"\x04\x00\x0f\x20\x00\x00\x00\x3c\x4a\x07\x04\x00\x0f\x20\x00\x00" \
    b"\x00\x50\x87\xe9\x00\x0a\x00\x68\x09\x21\x00\x02\x87\xe9\x09\x2f" \
    b"\x00\x04\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00\x00\x01" \
    b"\x52\x28\x00\x01\x00\x00\x09\x24\x00\x04\x00\x02\xf0\xe5\x09\x27" \
    b"\x00\x10\x00\x0e\x81\x09\xfe\xff\x64\x0f\xfe\xff\x00\x20\x00\x20" \
    b"\x00\x00\x09\x17\x00\x02\x03\x00\x09\x11\x00\x02\x00\x01\x09\x90" \
    b"\x00\x08\x20\x19\x03\x21\x16\x30\x43\x00\xf9\x98\x00\x04\xff\xff" \
    b"\xff\xff\x09\x50\x00\x0a\xf0\xe5\x20\x00\x0a\xa0\x00\x7f\xff\xff" \
    b"\x88\x16\x00\x07\x00\x4e\x09\x21\x00\x02\x88\x16\x09\x2f\x00\x04" \
    b"\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00\x00\x01\x42\x28" \
    b"\x00\x00\x00\x00\x09\x24\x00\x04\x00\x02\x41\x82\x09\x27\x00\x10" \
    b"\x00\x0e\x00\x48\x00\x52\x00\x20\x00\x20\x00\x20\x00\x20\x00\x00" \
    b"\x09\x11\x00\x02\x00\x02\x09\x50\x00\x0a\x41\x82\x04\x00\x0a\xa0" \
    b"\x00\x00\x00\x3d\x88\x1d\x00\x07\x00\x4e\x09\x21\x00\x02\x88\x1d" \
    b"\x09\x2f\x00\x04\x00\x01\x00\x06\x09\x3f\x00\x0c\x00\x00\x20\x00" \
    b"\x00\x01\x42\x28\x00\x00\x00\x00\x09\x24\x00\x04\x00\x02\x50\x0a" \
    b"\x09\x27\x00\x10\x00\x0e\x00\x52\x00\x52\x00\x20\x00\x20\x00\x20" \
    b"\x00\x20\x00\x00\x09\x11\x00\x02\x00\x03\x09\x50\x00\x0a\x50\x0a" \
    b"\x04\x00\x0a\xe0\x00\x00\x00\x0f\x88\x22\x00\x08\x00\xa0\x09\x21" \
    b"\x00\x02\x88\x22\x09\x2f\x00\x04\x00\x01\x00\x06\x09\x3f\x00\x0c" \
    b"\x00\x00\x20\x00\x00\x01\x42\x28\x01\x0c\x00\x00\x09\x24\x00\x04" \
    b"\x00\x02\x03\x00\x09\x27\x00\x10\x00\x0e\x00\x53\x00\x54\x00\x20" \
    b"\x00\x20\x00\x20\x00\x20\x00\x00\x09\x11\x00\x02\x00\x02\x09\x4b" \
    b"\x00\x54\x00\x08\x00\x50\x03\x01\x84\x00\x05\x12\x00\x7f\xff\xff" \
    b"\x03\x02\x84\x00\x05\x12\x00\x7f\xff\xff\x03\x3d\x84\x00\x05\x12" \
    b"\x00\x7f\xff\xff\x03\x3e\x84\x00\x05\x12\x00\x7f\xff\xff\x03\x3f" \
    b"\x84\x00\x05\x12\x00\x7f\xff\xff\x03\x40\x84\x00\x05\x12\x00\x7f" \
    b"\xff\xff\x03\x04\x84\x00\x05\x12\x00\x7f\xff\xff\x03\x07\x84\x00" \
    b"\x05\x12\x00\x7f\xff\xff\x09\x91\x00\x04\x0e\x7e\xf0\x00"

3、解析协议,层层递进,每层占用多少字节表示什么都需要根据协议结构定义走。

 4、这里介绍数值的表示方法涉及的二进制补码形式

数值用4个字节表示,第一个字节表示指数,后三个字节表示尾数

 4.1 数值表示:

数值由尾数(mantissa)和指数(exponent)组成,表示为:尾数 * 10^指数。
尾数和指数都使用二进制补码形式表示。
尾数不一定是规范化的。

4.2. 特殊值(无效值):

- NaN (非数字):尾数为 +2^23 - 1 (0x7fffff)
- NRes (此分辨率下无法表示):尾数为 -2^23 (0x800000)
- 正/负无穷大:尾数分别为 +(2^23 - 2) 和 -(2^23 - 2) (0x7ffffe, 0x800002)
对于这些特殊值,指数不重要。

4.3. 正常数值范围:

- 指数范围:-128 ≤ 指数 ≤ 127
- 尾数范围:-(2^23 - 3) ≤ 尾数 ≤ +(2^23 - 3)

4.4. 显示精度规则:

- 如果指数 < 0,小数点后的有效位数等于指数的绝对值。
- 如果指数 ≥ 0,小数点后的有效位数为零。

4.5. 计算示例:

- 0xfd007d00:指数 = -3,尾数 = 32000,表示 32.000

计算过程

十六进制先转二进制,通常使用最高位(最左边的位)来表示数字的正负码,  1开头是负数,负数的补码是其反码加1, 0开头是正数,正数的补码与其原码相同

- 0xfd007d00 ====> \xfd\x00\x7d\x00 (16进制)=====>11111101000000000111110100000000(二进制)

fd  ====> 11111101        1开头是负数,负数的补码是其反码(1变0, 0变1)加 1
fd的反码 ====>  00000010(二进制) ====> 2 (十进制)
补码 = 反码 + 1 ====> 2 + 1 = 3   ====> -3(因为是1开头,最终结果为-3) 
007d00(十六进制) ====> 000000000111110100000000  (二进制)  ====>  32000 (十进制)   0开头是正数(正数的补码与其原码相同) 

- 0xff000140:指数 = -1,尾数 = 320,表示 32.0
- 0x01000140:指数 = 1,尾数 = 320,表示 3200
- 0x02000020:指数 = 2,尾数 = 32,表示 3200

 

posted @ 2023-05-23 14:52  凡人半睁眼  阅读(69)  评论(0编辑  收藏  举报