进制处理

说明

数字

整数   -1 0 1

浮点   -0.1 0.0 1.0

二进制  0b11        结果 3

八进制  0o77        结果 63

16进制  0xFF        结果 255

Copy

字符串:str

纯字符串 ‘str’ “str” '''str''' """str"""

字符串数字(二进制 0b) ‘0b0’     转成字符 str(0b10) 结果 ‘2’     ## 可以前置补零str(0b00000010)

字符串数字(八进制 0o) ‘0o0’     转换字符 str(0o77) 结果 ‘63’    ## 可以前置补零str(0o0077)

字符串数字(十进制)    ‘0’       转换字符 str(100)  结果 ‘100’   ## 不能前置补零

字符串数字(16进制 0x) ‘0x0’     转换字符 str(0xFF) 结果 ‘255’   ## 可以前置补零str(0x00FF)

Copy

二进制:bytes

二进制字节表示 b”    # ASCII 字符 0-9 a-z A-Z 等

Copy

转换

import struct

print(struct.pack(‘B’, 0b11111111))

print(bytes(‘编程’,‘utf-8’))

字符串 转换成 数字

print(int(‘100’, 2))      # 二进制字符串 转换成 十进制数字【4】省略开头

print(int(‘0b100’, 2))    # 二进制字符串 转换成 十进制数字【4】以0b开头

print(int(‘0b0100’, 2))   # 二进制字符串 转换成 十进制数字【4】以0b开头并前置补0

print(int(‘255’))         # 十进制字符串 转换成 十进制数字【255】

print(int(‘255’, 10))     # 十进制字符串 转换成 十进制数字【255】

print(int(‘a’, 16))       # 十六制字符串 转换成 十进制数字【10】省略开头

print(int(‘0xa’, 16))     # 十六制字符串 转换成 十进制数字【10】以0x开头

print(int(‘0x0a’, 16))    # 十六制字符串 转换成 十进制数字【10】以0x开头并前置补0

数字 转换成 数字

print(bin(0b11))          # 二进制数字 转换成 二进制数字【0b11】无意义

print(oct(0b11))          # 二进制数字 转换成 八进制数字【0o3】

print(int(0b11))          # 二进制数字 转换成 十进制数字【3】可前置补0

print(hex(0b11))          # 二进制数字 转换成 十六制数字【0x3】

print(bin(255))           # 十进制数字 转换成 二进制数字【0b11111111】

print(oct(255))           # 十进制数字 转换成 八进制数字【0o377】

print(int(255))           # 十进制数字 转换成 十进制数字【255】无意义

print(hex(255))           # 十进制数字 转换成 十六制数字【0xff】

print(bin(0xff))          # 十六制数字 转换成 二进制数字 【0b11111111】

print(oct(0xff))          # 十六制数字 转换成 八进制数字 【0o377】

print(int(0xff))          # 十六制数字 转换成 十进制数字 【255】

print(hex(0xff))          # 十六制数字 转换成 十六制数字 【0xff】无意义

数字 转换成 字节码(是二进制,用16进制显示)

print(struct.pack(‘B’, 0b11111111))    # 二进制 转 字节码【b’\xff’】

print(struct.pack(‘>i’, 0b11111))      # 二进制 转 字节码【b’\x00\x00\x00\x1f’】0b11111 等于 31(10进制)

print(struct.pack(‘B’, 0))             # 十进制 转 字节码【b’\x00’】

print(struct.pack(‘B’, 1))             # 十进制 转 字节码【b’\x01’】

print(struct.pack(‘B’, 101))           # 十进制 转 字节码【b’e’】101 对应 16 进制的 0x65(此处返回值是显示为当前整数 101 对应的 ASCII字符 e)

print(struct.pack(‘B’, 255))           # 十进制 转 字节码【b’\xff’】无符号最大单字符可表示的数字

print(struct.pack(‘>i’, 255))          # 十进制 转 字节码【b’\x00\x00\x00\xff’】4字节大端表示的数字

print(struct.pack(‘<i’, 255))          # 十进制 转 字节码【b’\xff\x00\x00\x00’】4字节小端表示的数字

print(struct.pack(‘B’, 0xff))          # 十六制 转 字节码【b’\xff’】

print(struct.pack(‘>i’, 0xfff))        # 十六制 转 字节码【b’\x00\x00\x0f\xff’】4字节大端表示的数字

字符串 转换成 字节码

print(bytes(‘Python棒棒哒’, ‘utf-8’))  # Python 字节码【b’Python\xe6\xa3\x92\xe6\xa3\x92\xe5\x93\x92’】

print(‘Python棒棒哒’.encode(‘utf-8’))  # Python 字节码【b’Python\xe6\xa3\x92\xe6\xa3\x92\xe5\x93\x92’】

B = bytes(‘Python棒棒哒’, ‘utf-8’)

FMT = str(len(B)) + ‘s’

print(struct.pack(FMT, B))             # Python 字节码【b’Python\xe6\xa3\x92\xe6\xa3\x92\xe5\x93\x92’】

字符串 按照 utf-8 的方式转换成 十六制字符串

print(bytes(‘棒棒哒’, ‘utf-8’).hex())

以十六进制写的字符串,转换成字节码

print(bytes.fromhex(‘01’))             # 单字节【b’\x01’】

print(bytes.fromhex(‘0001’))           # 双字节【b’\x00\x01’】

print(bytes.fromhex(‘aabbccddeeff’))   # 多字节【b’\xaa\xbb\xcc\xdd\xee\xff’】

字节码 转换成 字符串

注意:字节码是 b’\x05’ ,表现为 16 进制的形式。这里取出16进制表示的内容。

注意:字符串是  ‘\x05’ 。

注意:32位系统,一个字符占4个字节,32个bit位? 2个16进制数代表一个Byte?

注意:64位系统,一个字符占8个字节,64个bit位? 4个16进制数代表一个Byte?

注意:一个 Byte 就是占用 8 bit,无论在多少位操作系统中。

注意:一个单位表示一个Byte,就是 8 位,其中每 4 位(相当于 4 位二进制数,最小值为 0 ,最大值为 15)可以用一个十六进制数来表示,因此每字节需要两个十六进制数表示,如 \xe6

注意:utf-8编码:一个中文包含繁体字等于三个字节,一个英文字符等于一个字节。

注意:gbk编码:一个中文包含繁体字等于二个字节,一个英文字符等于一个字节。

注意:ASCII 是一种字符集,包括大小写的英文字母、数字、控制字符等,它用一个字节表示,范围是 0-127。

Unicode分为UTF-8和UTF-16,UTF-8变长度的,最多 6 个字节,小于 127 的字符用一个字节表示,与 ASCII 字符集的结果一样,ASCII 编码下的英语文本不需要修改就可以当作 UTF-8 编码进行处理。

print(b’Python\xe6\xa3\x92\xe6\xa3\x92\xe5\x93\x92’.decode(‘utf-8’))

字节码 转换成 十六制字符串

print(b’\xaa\xbb\xcc\xdd\xee\xff’.hex())  # 【aabbccddeeff】

print(b’0’.hex())                         # 字符 0 在 ASCII 码上的数字(数字是16进制表示)== 48(十进制)【30】

print(b’z’.hex())                         # 字符 z 在 ASCII 码上的数字(数字是16进制表示)【7a】

字节码(16进制表现) 转换成 数字(10进制表现)

print(struct.unpack(‘B’, b’\xff’))                 # 【(255,)】 单字节

print(struct.unpack(‘>i’, b’\x00\x00\x00\xff’))    # 【(255,)】 4字节,大端模式

print(struct.unpack(‘<i’, b’\x00\x00\x00\xff’))    # 【(-16777216,)】 4字节,小端模式

整数 与 ASCII 字符相互转换

print(chr(97))   # 【a】

print(ord(‘Z’))  # 【90】

ASCII 字符 和 bin(字节)

from binascii import b2a_hex, a2b_hex

Copy

struct

准确地讲,Python没有专门处理字节的数据类型。但由于str既是字符串,又可以表示字节,所以,字节数组=str。而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,float的转换。在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的bytes,是非常费劲的。这时候就需要用到 struct 包来处理了。尽管Python不适合编写底层操作字节流的代码,但在对性能要求不高的地方,利用struct就方便多了。

打包

struct的pack函数把任意数据类型变成bytes。

import struct

bytes_1 = struct.pack(‘>I’, 99999)

Copy

其中>表示字节顺序是 big-endian ,也就是网络序,I表示4字节无符号整数。后面的参数个数要和处理指令一致。

解包

unpack把bytes变成相应的数据类型。

import struct

(key, value) = struct.unpack(‘>IH’, b’\xf0\xf0\xf0\xf0\x80\x80’)

Copy

根据>IH的说明,后面的bytes依次变为I是4字节无符号整数和H是2字节无符号整数。

案例

Windows的位图文件(.bmp)是一种非常简单的文件格式。

首先找一个bmp文件,读入前30个字节来分析:

s = b’\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00’

res = struct.unpack(‘<ccIIIIIIHH’,s)

print(res)

(b’B’, b’M’, 691256, 0, 54, 40, 640, 360, 1, 24)

Copy

结果显示,b’B’、b’M’说明是Windows位图,位图大小为640x360,颜色数为24。

字节序说明

CharacterByte orderSizeAlignment
nativenativenative
nativestandardnone
little-endianstandardnone
big-endianstandardnone
network (= big-endian)standardnone

引用

https://docs.python.org/3/library/struct.html#format-characters