进制处理
说明
数字
整数 -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。
字节序说明
Character | Byte order | Size | Alignment |
native | native | native | |
native | standard | none | |
little-endian | standard | none | |
big-endian | standard | none | |
network (= big-endian) | standard | none |
引用
https://docs.python.org/3/library/struct.html#format-characters