关于Python字符编码与二进制不得不说的一些事

二进制

核心思想:

  冯诺依曼 + 图灵机

  电如何表示状态,才能稳定?

    计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性,
    简单始终是建立再稳定、可靠基础上

    经过尝试10进制,但很难检查电流的状态差异并且很难稳定状态,最稳定的检查是
    通电和不通电状态,共两种状态那就规定 通电为 1 不通电 为 0,1和0的状态逻
    辑被称为比特 Bit

  那么如何用 0 和 1 表示数字和字符呢?

    首先找出需要表示的字符,英文字符和数字字符才100多个,需要 7 个二进制位就
    可以全部表示,但为了可扩展性,多出一位表示扩展,这就是ASCII码

    因为一个字符只需要最多8个二进制位表示,所以规定8个字节作为存储单位,所有
    8 Bit = 1 Byte

    规定字符用数字表示,数字用二进制表示,也就是 字符 --> 数字 -- > 二进制,
    那么文本信息就可以通过计算机存储为二进制,计算机上存储的二进制数可以逆转
    成文本信息

    10 进制到二进制之间的关系转换是固定的,那么字符到数字之间的转换被我们称为
    字符编码, ASCII码 Unicode UTF-8 都是存储字符与数字之间的映射关系

 弄清楚几个关系

  1. 字符与数字之间的关系为映射关系,人为规定的标准

      这种映射关系,生活中普遍存在,如

    a. 身份证信息与身份证号码

    b. 数据库id与该行信息

    c. 订单信息与订单编号

    d. 员工编号与员工

    e. 字典的键与值

    f. 内存地址与存储在该地址上的值

    ...

  2. 数字到二进制之间的关系,这个如同数学或物理定律一样,固定转换方式,写死的

  3. 8进制 16 进制都是建立在2进制的基础上,和10进制之间没有直接关系,主要为了

   可读性,二进制的两种表示形式

   如二进制 00000000 一个存储单位,八进制000 000 000 每 3 个二进制位转

   换位10进制表示,最小数为 0 最大数为 7,所以取值范围为 0 - 7

   十六进制 0000 0000 每 4个二进制位转换位10进制表示,最小位为0 最大为15,

   所有取值范围为 0 - 15,因为超出10机制表示范围所以用 abcdef表示 10 11

   12 13 14 15

   十六进制常用于 内存地址表示 IPv6地址 颜色表 mac地址 二进制数据\x前缀b/B

    IP地址(32位 点分十进制) x.x.x.x 每个x都是8个bit位表示的十进制数字

  # 8进制 16进制是建立在二进制的基础之上

Py进制转换函数

  10进制转其他进制

    转2进制 bin 前缀0b

    转16进制 hex 前缀0x

    转8进制 oct 前缀0o

    # 二进制 八进制 十六进制都是通过带前缀的字符串形式"0b/o/x..."

# 10 进制转其他进制
number = 9999
print("10进制转其他进制".ljust(40, "*"))
# 10 进制转2进制
b_number = bin(number)
print("二进制:", b_number)
# 10进制转8进制
o_number = oct(number)
print("八进制:", o_number)
# 10进制转16进制
h_number = hex(number)
print("十六进制:", h_number)

  其他进制转10进制 int(..., base) base指定进制

# 10 进制转其他进制
number = 9999
print("10进制转其他进制".ljust(40, "*"))
# 10 进制转2进制
b_number = bin(number)
print("二进制:", b_number)
# 10进制转8进制
o_number = oct(number)
print("八进制:", o_number)
# 10进制转16进制
h_number = hex(number)
print("十六进制:", h_number)
 
# 其他进制转10进制
# 2进制转10进制
num_b = int(b_number, base=2)
print(num_b)
# 8 进制转10进制
num_o = int(o_number, base=8)
print(num_o)
# 8 进制转16进制
num_h = int(h_number, base=16)
print(num_h)

  字符串转二进制字符串

    bytes

    encode

    需要指定字符编码,结果前缀为 b/B"..."

# 字符串转二进制字符串
song = "你骄傲的飞远,我栖息的夏天"
 
byte_song = song.encode(encoding="utf-8")
print(byte_song)
# 等价于
eq_byte_song = bytes(song, encoding="utf-8")
print(eq_byte_song)
print(byte_song == eq_byte_song)

关于Python字符编码与二进制不得不说的一些事

扫一扫手机访问