Python 字节串比特串转换以及大小端相关的几个方法

Python 处理字节串:struct.pack和struct.unpack Python struct模块1. structstruct.packstruct.unpack2. 格式2.1 字节顺序,大小和对齐方式2.2 格式字符 1. struct struct是用来解决bytes和其他二进制数据类型的转换的模块,它使得流的操作变得非常简单,完美解决了Python没有字节数据类型的尴尬。 主要功能: Python数据类型 ——> “字节串” “字节串” ——> Python数据类型 struct.pack struct的pack函数把任意数据类型变成bytes 阅读详情

大端 小端 介绍

查看当前系统是大端还是小端: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填充字节
cchar长度为1的字节串1
bsignedchar整数1
Bunsignedchar整数1
?_Boolbool1
hshort整数2
Hunsignedshort整数2
iint整数4
Iunsignedint整数4
long整数4
Lunsignedlong整数4
qlonglong整数8
Qunsignedlonglong整数8
nssize_t整数
Nsize_t整数
e浮点数2
ffloat浮点数4
ddouble浮点数8
schar[]字节串
pchar[]字节串
Pvoid*整数
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的结构不够严谨。

DPABI安装教程 DPABI是是中科院心理研究所严超赣老师团队开发的一款磁共振脑影像数据分析工具包。基于SPM,在安装DPABI之前需要安装好SPM,才能正常使用。SPM的安装方法见文matlab2021a版本条件下安装spm_kidllll的博客-CSDN博客 1、下载安装包 下载地址:DPABI: a toolbox for Data Processing & Analysis for Brain Imaging | The R-fMRI Network 2、将下载好的dpabi文件夹移动到matl.. 阅读详情

相关推荐

Python教程:一文了解从Bytes到Bits的数据转换

Python编程中,处理数据时经常需要在字节(bytes)和位(bits)之间进行转换。这种转换在网络通信、数据加密、图像处理等领域尤为常见。本文将详细介绍如何在Python中进行字节与位之间的转换,并提供一个实用的功能:如何在指定的位位置替换位数据。

旦莫的博客 2226

大端小端

对于0x11223344 储存如下:

junjun5156的博客 621

1、硬件工程师笔面试真题汇总(2025版本)

答:按照使用习惯,电源指示灯用红色,信号指示灯用绿色这两种颜色的LED 灯技术最成熟,价格最便宜通孔是贯穿整个PCB 的过孔盲孔是从PCB 表层连接到内层的过孔埋孔是埋在PCB 内层的过孔。大多数PCB厂家的加工能力是这样的:大于等于8mil 的过孔可以做机械孔小于等于6mil 的过孔需要做激光孔对小于等于6mil 的微型孔,在钻孔空间不够时,允许一部分过打在PCB 焊盘上。

XU157303764的博客 2万+

大小端系统判断

大端系统(Big-endian):数据的低字节存放在高地址中。如power pc,aix等。 小端系统(Little-endian):数据的低字节存放在低地址中。 如arm,x86,amd等。 判断大小端系统的代码: int checkCPU( ) { union w { int a; char b; } c;

ychl87的专栏 1114

python的进制转换字节串大端小端

什么叫小端,什么叫大端?纯属个人理解,还未深入。 小端即在内存中低位存储的是小数据,高位存的是大数据,比如12345(一万两千三百四十五),123存储在高位,45存储在低位,这就是小端。 如上数据反过来,45存储在高位,123存储在低位则叫做大端。 整数之间的进制转换: 10进制转16进制: hex(16) ==> 0x10 16进制转10进制: int('0x10', 16) ==> 16 二进制与八进制同理: bin(1) ==> 01 int('...

youcijibi的博客 7120

python bitarray_Python的 bitarray 库测试。。

标签:#-*-coding:utf-8-*-importsysimporttimeimporttimefromcollectionsimportnamedtuplet=[("u32","n1"),#格式,变量名称("u6","n2"),("u4","n3"),("u3","n4"),("u3","n5"),("u16","n6"),("u7","n7"),("u3","...

weixin_39743622的博客 810

字符大小端aix linux,long, unsigned long不是跨平台的(慎用)

项目中用到long、long long等字段,遇到一些问题。先说得到的一些结论:大小端:Windows、Linux是小端,AIX是大端。sizeof(指针类型)=程序位数/8。long、unsigned long不是跨平台的,一定要慎用。自己写了程序测试各平台下(Windows、Linux、AIX),C++各基本类型的最大值、最小值,以及占用字节数。#include #include using ...

weixin_33156085的博客 505

探索创新数据处理:Bitstring 库详解

探索创新数据处理:Bitstring 库详解 在计算机科学中,位操作是基础但至关重要的部分,尤其是在高效内存管理和低级别编程中。bitstring 是一个精心设计的 Python 库,它使得对位和字节的操作变得简单直观,无论是新手还是经验丰富的开发者都能轻松上手。 项目简介 bitstring 是由 Scott Griffiths 开发的一个 Python 模块,它的目标是提供一种强大而灵活的方式...

gitblog_00048的博客 783

Python 字节流、字符串、十六进制相互转换(binascii、bytes)

问题描述 最近做一个项目,是用Python进行相关的串口操作。及将相关指令通过串口发给设备,设备根据发过来的指令来做出相应的操作,所用的库是Pyserial。在最初开发时,出现的问题在于:别人给的文档里面的命令是十六进制的。例如,给出一个指令: 5aa5 07 82 1000 3132 3334 。 那么,我们需要思考的是,我们如何将上面的指令,转换为pyserial库进行写操作时(w...

GodLordGee的博客 2万+

大小端是什么?如何判别?

在计算机系统中,内存的最小存放单元是字节,即一个地址对应一个字节,可以保存一个字节(8Bit)的数据,但是在计算机系统中又不可能全部都是一个字节的存储方式,还有一些8位、16位、32位的系统,它们还会有2个字节、4个字节的变量。

weixin_43866583的博客 4158

01比特串异或 python_异或

5.1 概述异或(XOR)是一种逻辑二元操作,当两个输入中有且仅有一个为真时,结果为真。另一种思考异或的方式是把当作一种“可编程的监视器”,一个输入的比特决定是否需要翻转另一个比特,还是直接保持其不变。我们用下面的符号来表示异或操作:image-20210121153027852.png通常i是索引,Pi指的是原文中的一个比特,ki指的是密钥中的一个比特,Ci指的是加密后的密文比特。5.2 异或的...

weixin_30335379的博客 1644

数字转二进制(4种方法) | 位域(位段)应用 —— 从内存中提取数字的二进制

有关位段的知识点,可以参考文章:有关联合体嵌套结构体 、位域(位段)、小端存放 一、对于将求解整数的二进制的几种思路 对于数字转二进制的求解方法有很多: 1. 利用二进制满2进1的特性反向操作,对数字取余,整除2 。 #include<stdio.h> int main(void) { char str[65] = ""; unsigned long long n; printf("Supports a maximum of 64 bits

专注于C/C++/Linux领域创作 6310

python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程

第 1 章 套接字、IPv4和简单的客户端/服务器编程本章攻略:打印设备名和IPv4地址获取远程设备的IP地址将IPv4地址转换成不同的格式通过指定的端口和协议找到服务名主机字节序和网络字节序之间相互转换设定并获取默认的套接字超时时间优雅地处理套接字错误修改套接字发送和接收的缓冲区大小把套接字改成阻塞或非阻塞模式重用套接字地址从网络时间服务器上获取并打印当前时间编写一个SNTP客户端编写一个简单的...

weixin_39683021的博客 397

python:数据类型、编码方式(base64、utf--8)、python中的进制、\u,\x,0x区别 力荐力荐力荐

python:数据类型、编码方式(base64、utf--8)、python中的进制、\u,\x,0x区别? 数据类型 与 编码方式?为什么会有不同数据类型?python基础数据类型有哪些?计算机如何通过二进制的0、1表示不同的数据类型?字节、字符、字符串三者区分?不要以为带b的就是二进制。(易混淆)区分'ABC'和b'ABC' 以及 str --> bytes (很多干货)python中bytes和string的区分?(干货)何时用utf-8编码何时用base-64编码?

qq_40967086的博客 6672

Python-字节总结(bytes、bytearray、方法、内置函数、模块)

bytes bytes:不可变的字节序列 bytearray bytearray:可变的字节数组 memoryview 编码与解码 编码:就是,你用几个字节去理解内存中的数字。 解码:就是,将内存中的字节数组按照什么字符集解码成对应的字符 字符串按照不同的字符集编码encode返回字节序列bytes encode(encoding=‘utf-8’,errors=‘strict’)->bytes 注意encode默认转换时的默认编码集是utf-8 字节序列按照

关注网络安全、云原生安全 1万+

python 输入的一组数据成为列表_Python的数据类型(二)

大家好,在上一次推送中,我们一起学习了Python数据结构中的整数int、浮点数float以及复数,今天我们一起来学习其他的一些数据类型吧。一、逻辑值1.逻辑类型:bool.(1)用来作为判断条件,是逻辑推理的基础:仅有两个值:True、False.(2)数值的比较得到逻辑值:3 > 4。(3)逻辑值也有自己的运算:and,or,not.(4)可以让计算机根据情况自动作出选择,更加聪明。2.逻辑值...

weixin_39772420的博客 742

python 字节(bytes和bytearray类)

一个字节(byte)是由8个bit组成,其存储范围是00000000~11111111 1,定义: (1)bytes定义: b’abc’ 由三个字节构成,第一个字节

bigear_yu的博客 2176

python 把int类型转bytes以及把bytes 转int 类型(使用方法to_bytes ,from_byte, struct)

https://blog.csdn.net/qq_33210042/article/details/118303233?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1.essearch_pc_relevant&spm=1001.2101.3001.4242.2 把int类型转bytes 方法1 使用方法to_bytes to_bytes 方法里面有3个参数 , 第一个数是指定要

爱她就要努力 1519

python 字符串

1、字符编码   一个字节8个比特位(bit) (1)、ASCII---美国,ASCII占用一个字节     字符串  十进制  十六进制     '0'    48    0x30     'A'    65    0x41     'a'    97    0x61 (2)、GB2312--简体中文    big--繁体中文,一个中文字符占用3个字节,各国有各国的标准...

凌逆战的博客 695

Python赋值,数据类型及操作符学习

Python的赋值与C,C++类似,在使用变量之前需要对变量进行赋值; 变量的命名:可以使用任何合法的名字,但是作为一个优秀的程序员,需要将变量的名字起的有意义,加强代码的可读性; 字符串:单引号或者双引号将其引用 但是如果字符串中出现单引号或双引号怎么办? 我想:可以使用转义字符串(\) 'Let\'s go!' 长字符串 使用三引号 数据类型: 整型、e记法、布尔类型、浮点型

bit_dangersmile的博客 515

Oxygen XML Editor

Oxygen XML Editor是一款基于Java的XML编辑器,支持XML, XSL, TXT, XSD, DTD文档,能自行校验XML, XSL, XSD代码,提示脚本错误。Oxygen能自动完成结束标签,代码高亮现实,支持Unicode,亲测可用.

上一篇: Python 字符串/字节串 拼接、追加,推荐使用join
下一篇: Python,关于各种串的切片逆序处理界限问题
一心月
博客等级 码龄19年 39粉丝 143原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值