主页

索引

模块索引

搜索页面

二进制

bytes and bytearray

bytes 和 bytearray的差別,一个可变一个不可变:

blist = [1, 2, 3, 255]
the_bytes = bytes(blist)
print(the_bytes)      # b'\x01\x02\x03\xff'

the_byte_array = bytearray(blist)
print(the_byte_array)   # bytearray(b'\x01\x02\x03\xff')

the_byte_array[1] = 127 #可变
print(the_byte_array)   # bytearray(b'\x01\x7f\x03\xff')

使用struct转换二进制文件

使用标准函数库里的struct來作为转换二进制文件:

< 小端方案
> 大端方案

标识符

描述

字节

x

跳过一个字节

1

b

有符号字节

1

B

无符号字节

1

h

有符号短整数

2

H

无符号短整数

2

i

有符号整数

4

I

无符号整数

4

l

有符号长整数

4

L

无符号长整数

4

Q

无符号 long long 型整数

8

f

单精度浮点数

4

d

双精度浮点数

8

p

数量和字符

1 + 数量

s

字符

数量

实例:

import struct
valid_png_header = b'\x89PNG\r\n\x1a\n'   #png的文件头
data = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR' +
    b'\x00\x00\x00\x9a\x00\x00\x00\x8d\x08\x02\x00\x00\x00\xc0')   #一张图文件的前段

if data[:8] == valid_png_header:
    width, height = struct.unpack('>LL', data[16:24])
    print('Valid PNG, width', width, 'height', height)    # Valid PNG, width 154 height 141
else:
    print('Not a valid PNG')

#反过来转换
print(struct.pack('>L', 154))     # b'\x00\x00\x00\x9a'
print(struct.pack('>L', 141))     # b'\x00\x00\x00\x8d'

print(data[16:24])    # b'\x00\x00\x00\x9a\x00\x00\x00\x8d'
print(struct.unpack('>2L', data[16:24]))    # (154, 141)
print(struct.unpack('>16x2L6x', data))      # (154, 141)

其他二进制工具

binascii函数

十六进制、六十四进制、uuencoded,等等之间的转换函数:

import binascii

#八字节转十六bytes
valid_png_header = b'\x89PNG\r\n\x1a\n'
print(binascii.hexlify(valid_png_header))       # b'89504e470d0a1a0a'

#十六bytes转八bytes
print(binascii.unhexlify(b'89504e470d0a1a0a'))  # b'\x89PNG\r\n\x1a\n'

主页

索引

模块索引

搜索页面