大端 小端 介绍
查看当前系统是大端还是小端:sys.byteorder,Windows是小端的,而小端在我们看来是和常规反向地
关于大小端的知识,推荐几篇文章:
CPU架构决定大小端模式
理解大端与小端字节序
字符编码方式及大端小端
大端小端取决于CPU架构,powerpc,aix、SPARC等是大端;x86架构处理器(Intel、AMD,PC)、arm架构处理器(arm,手机)是小端
大端存储模式是指字或半字的最高字节(Most Significant
Bit,MSB)存放在内存的最低位字节地址上,而字数据的低字节则存放在高地址中。 (1) 数据在寄存器中都是以大端模式次序存放的。
(2) 对于内存中以小端模式存放的数据。CPU存取数成时,小端和大端之间的转换是通过硬件实现的,没有数据加载/存储的开销。
这也是为什么说Windows系统是小端,而Linux可能是大端也可能是小端
相关模块
· binascii : str,bytes 字节串与ascii字符
· hex : str 十进制与十六进制
· bytes : 类 单位为bytes 字节串 hex, decode 字节串与十六进制字符串、字符编码
· int : to_bytes, from_bytes 十进制与字节串,必须指定大小端
· str : encode 字符编码至字节串
· bitstring : 第三方类 单位为bit 比特串 .Bits(bytes) .bin .hex .oct 比特串(切片、索引、搜索)与字节串(输入)与字符串(各种进制输出),在生成时可以指定大小端,索引的元素值是bool值
pip安装
使用手册网页版
使用手册pdf版
· struct : 按照内置算法转换类型至C类型 类型结构与字节串
读取符号位
我就因为需要这个功能才相对字节串甚至比特串操作的,虽然最后没用到专门的模块
最终方法:
0 if b[0]<=128 else 1
# 84.7 ns
b[0]<=128
# 79 ns
b='\xff'
bin(int(b.hex(),16))[2:].rjust(len(b)*8,'0')
# 828 ns
bin(b[0])[2:].rjust(8,'0')[0]
# 412 ns
bytes的索引会自动返回int,而bin可以直接处理int,去头后补齐8位读取第一位
字节串的赋值表达式
bytes((1,2,ord('1'),ord('2'))) # 可迭代类型,元素是数字
Out[226]: b'\x01\x0212'
bytes((0xff,))
Out[231]: b'\xff'
bytes(3) # 生成3个字节的字节串
Out[229]: b'\x00\x00\x00'
字节串大小端互换 bytes[::-1]
字节自己的次序单位就是1字节(FF)而非4比特(F),也不是1比特(1),所以字节串的切片法就是切换大小端的方式,不过因为没有标记描述某字节串是大端还是小端,所以建议仅最初(加载小端)和最终(写入或展示小端)的时候才使用大小端互换,一般就用我们习惯的大端去表示
在整数与字节串互转以及struct那里有大小端结构的设置
struct
他是专门解释十六进制和各种数据类型的,但是他只是解释层,而非真实层,他是以他内有的算法而将对应的类型转换成十六进制,并不是真的从内存中读取真实的存储结构,例如超位整数。
struct的作用是把指定格式的数据打包成二进制,解包同理。
@: native order, size & alignment (default)
=: native order, std. size & alignment
<: little-endian, std. size & alignment
>: big-endian, std. size & alignment
!: same as >
| 字符 | 字节顺序 | 大小 | 对齐方式 |
|---|---|---|---|
| @ | 按原字节 | 按原字节 | 按原字节 |
| = | 按原字节 | 标准 | 无 |
| < | 小端 | 标准 | 无 |
| > | 大端 | 标准 | 无 |
| ! | 网络(= | 大端) | 标准 |
| 格式 | C类型 | Python类型 | 标准大小 |
|---|---|---|---|
| x | 填充字节 | 无 | |
| c | char | 长度为1的字节串 | 1 |
| b | signedchar | 整数 | 1 |
| B | unsignedchar | 整数 | 1 |
| ? | _Bool | bool | 1 |
| h | short | 整数 | 2 |
| H | unsignedshort | 整数 | 2 |
| i | int | 整数 | 4 |
| I | unsignedint | 整数 | 4 |
| l | ong | 整数 | 4 |
| L | unsignedlong | 整数 | 4 |
| q | longlong | 整数 | 8 |
| Q | unsignedlonglong | 整数 | 8 |
| n | ssize_t | 整数 | |
| N | size_t | 整数 | |
| e | 浮点数 | 2 | |
| f | float | 浮点数4 | |
| d | double | 浮点数 | 8 |
| s | char[] | 字节串 | |
| p | char[] | 字节串 | |
| P | void* | 整数 |
struct.pack('L', 0x1234ab)
Out[266]: b'\xab4\x12\x00'
struct.pack('>L', 0x1234ab)
Out[240]: b'\x00\x124\xab'
Python3.4.3使用struct模块的pack、unpack对字节数据的处理(压包,解包)
struct.pack('9si2s',b'HTTP/1.1 ',200,b'OK')
这里要注意字符串需要添加字符个数的,我就在这里蒙了很久,写不出来
这里
其他类型与字节串互转
· 二进制 bitstring.Bits(bytes),Bits.hex,Bits.bin,Bits[1:2]
· 字符串 str.encode;bytes.decode
· 整数 int.to_bytes;int.from_bytes,这里有一个btyeorder的参数,可以直接设置输出是大端还是小端
int.to_bytes(16,length=2,byteorder='big')
Out[78]: b'\x00\x10'
· 十六进制字符串 bytes.fromhex,binascii.unhexlify(hexstr);bytes.hex
binascii.unhexlify('1ff3')
Out[145]: b'\x1f\xf3'
binascii.unhexlify(b'1ff3')
Out[146]: b'\x1f\xf3'
binascii.hexlify(b'1ff3')
Out[147]: b'31666633'
binascii.hexlify(b'\x1f\xf3')
Out[148]: b'1ff3'
'1ff3'.encode()
Out[154]: b'1ff3'
这里b’1ff3’虽然是字节串类型,但是他表示的就是一串ascii字符,这里会自动将他作为一串ascii字符串处理,就是’1ff3’,而在第三行,他又被当作字节串处理,解码出的又被当作字符串处理,有点绕,我只能说这个方法编写的比较模糊。
字节码在表示时有两种模式,纯十六进制表示,就是上面unhexlify的结果。
还有就是尝试尽可能使用ascii表示,例如HxD,其实这才应该是Python的默认模式,而binascii的默认模式是纯hex模式。
‘b17c9385d9783963a8’这是从内存中读取的片段,而他默认的bytes显示是:
b’\xb1|\x93\x85\xd9x9c\xa8’
>>> binascii.hexlify(b'\xb1|\x93\x85\xd9x9c\xa8')
b'b17c9385d9783963a8'
嗯嗯,原来如此,至少这个功能的意思是把
len(b'b17c9385d9783963a8')
Out[191]: 18
len(b'\xb1|\x93\x85\xd9x9c\xa8')
Out[192]: 9
binascii.hexlify(b'b17c9385d9783963a8')
Out[194]: b'623137633933383564393738333936336138'
b'b17c9385d9783963a8'.hex()
Out[196]: '623137633933383564393738333936336138'
但是为什么两个的长度不一样呢,这里b又被当作了一串ascii的表示,b1是’b1’而非0xb1。
又或者我在里面加上\x,他只会把挨着他的后面两个值当作hex而非ascii处理。
那么若想hexlify出b’b17c9385d9783963a8’,还有其他方法吗?
bytes.fromhex('b17c9385d9783963a8')
Out[199]: b'\xb1|\x93\x85\xd9x9c\xa8'
binascii.hexlify(b'\xb1|\x93\x85\xd9x9c\xa8')
Out[200]: b'b17c9385d9783963a8'
而最初的b’\xb1|\x93\x85\xd9x9c\xa8’,是我string_st的内存片段。我只能说binascii的结构不够严谨。
2226




被折叠的 条评论
为什么被折叠?



