Python常见类型转换合集
近期在工作中常常接触到各种转换,如字符串转byte,byte转字符串,还有byte数组转成报文能接纳的格式(bin格式的十六进制)。故有必要系统的总结一下Python中常见的类型转换。
一:常见类型的概念
| 类型 | 举例 | 说明 | 
| 二进制 | a = 0b1010 | 二进制以0b打头 | 
| 八进制 | b = 0o2345 | 八进制以0o打头(注意是字母的o) | 
| 十进制 | c = 500 | 十进制没有前缀 | 
| 十六进制 | d = 0x12ff | 十六进制以0x打头 | 
| 字符串 | e = "ftz" | 字符串的内容用引号或双引号括住 | 
| 字节 | f = b'f12345' | 字节以b修饰,内容用引号或双引号括住 | 
| bin十六进制 | g = b'\x18\x17\x25' | 报文中的码流存在形式 | 
二:类型转换
1,二进制,八进制,十进制,十六进制转换
>>> var = 100
>>> bin(var) #其他进制转二进制
'0b1100100'
>>> oct(var) #其他进制转八进制
'0o144'
>>> int(var) #其他进制转十进制
100
>>> hex(var) #其他进制转十六进制
'0x64'
>>>
2,数值字符串转换
>>> var = 100
>>>
>>> strNum = str(var) #数值转字符串
>>> strNum
'100'
>>>
>>> intNum = int(strNum) #字符串转数值
>>> intNum
100
>>>
注意:字符串转数值常见,转换成功的前提是被转换的对象只有全是数字字符才可以,不然会报错如下所示,此场景的转换一般在转换前要对对象进行判断用字符串的方法isdigit()
>>> int('abc')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'
>>> 'abc'.isdigit()
False
>>> '124'.isdigit()
True
>>>3,字符串和字节byte转换
解码的本质是选择二进制对应的图形,编码的本质是把字符图形转成相应编码的二进制。这只是一种显示的变化,在内存上并不一定有变化
>>> byteMyName = b'ftz'
>>> strMyName = 'ftz'
>>>
>>> strMyName.encode() #字符串转byte
b'ftz'
>>> byteMyName.decode() #byte转字符串
'ftz'
下面具体看下两个转换方法
decode方法有两个参数,encoding默认是用'utf-8'进行解码,errors默认用'strict'模式,如果需要一定的容错,则用'ignore'
 |  decode(self, /, encoding='utf-8', errors='strict')|      Decode the bytes using the codec registered for encoding.||      encoding|        The encoding with which to decode the bytes.|      errors|        The error handling scheme to use for the handling of decoding errors.|        The default is 'strict' meaning that decoding errors raise a|        UnicodeDecodeError. Other possible values are 'ignore' and 'replace'|        as well as any other name registered with codecs.register_error that|        can handle UnicodeDecodeErrors.
decode() 方法的语法格式如下:
bytes.decode([encoding="utf-8"][,errors="strict"])decode() 方法用于将 bytes 类型的二进制数据转换为 str 类型,这个过程也称为“解码”
| 参数 | 含义 | 
|---|---|
| bytes | 表示要进行转换的二进制数据。 | 
| encoding="utf-8" | 指定解码时采用的字符编码,默认采用 utf-8 格式。当方法中只使用这一个参数时,可以省略“encoding=”,直接写编码方式即可。 注意,对 bytes 类型数据解码,要选择和当初编码时一样的格式。 | 
| errors = "strict" | 指定错误处理方式,其可选择值可以是: 
 | 
encode方法同样有两个参数,encoding默认是用'utf-8'编码进行转换
 |  encode(...)|      S.encode(encoding='utf-8', errors='strict') -> bytes||      Encode S using the codec registered for encoding. Default encoding|      is 'utf-8'. errors may be given to set a different error|      handling scheme. Default is 'strict' meaning that encoding errors raise|      a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and|      'xmlcharrefreplace' as well as any other name registered with|      codecs.register_error that can handle UnicodeEncodeErrors.
encode() 方法的语法格式如下:
str.encode([encoding="utf-8"][,errors="strict"])注意,格式中用 [] 括起来的参数为可选参数,也就是说,在使用此方法时,可以使用 [] 中的参数,也可以不使用。
encode()参数及含义
| 参数 | 含义 | 
|---|---|
| str | 表示要进行转换的字符串。 | 
| encoding = "utf-8" | 指定进行编码时采用的字符编码,该选项默认采用 utf-8 编码。例如,如果想使用简体中文,可以设置 gb2312。 当方法中只使用这一个参数时,可以省略前边的“encoding=”,直接写编码格式,例如 str.encode("UTF-8")。 | 
| errors = "strict" | 指定错误处理方式,其可选择值可以是: 
 | 
4,报文数据包和其他类型的互转
上面的都是铺垫,本节将是要重点介绍的内容。在用scapy构造报文或者编辑报文的过程中,常常需要从报文中提取我们感兴趣的内容或者将我们改造的数据插入到报文中。这里面就需要用到各种转换。最基本的操作就是将bin十六进制(报文中的数据,也称为码流)转int、转byte、转str。相反插入一段数据或者构造的数据到报文中,则是将int、byte、str类型转成bin十六进制。

下面将对十六进制码流和int、byte、str互转进行定义
| bin十六进制转int | 将二进制文件中的b“\x01\x79”转为“377”的过程。本质上讲,就是把一个byte型十六进制数,转成十进制数的过程。(注意区别:int(0x178)时参数0x179是16进制整型而b’\x01\x79’是byte数组) | 
| int转bin十六进制 | 将“377”转为二进制文件中的b“\x01\x79”的过程。本质上讲,就是把一个十进制数,转成byte型十六进制数的过程。(注意区别:hex(377)得到的0x179是16进制整型而b’\x01\x79’是byte数组) | 
| bin十六进制转byte | 将二进制文件中的b“\x04\xf9\x38\xad\x13\x26”取为b‘04f9381326’的过程。本质上讲,就是将每个十六进制数(4bit),转成一个采用ascii编码的byte(8bit)的过程 | 
| byte转bin十六进制 | 将b‘04f9381326’取为二进制文件中的b“\x04\xf9\x38\xad\x13\x26”的过程。本质上讲,就是将每个采用ascii编码的byte(8bit),转成一个十六进制数(4bit)的过程 | 
| bin十六进制转str | 将二进制文件中b’\x48\x54\x54\x50’取为字符串‘HTTP’的过程。本质上讲,就是将ascii编码转成对应字符的过程。 | 
| str转bin十六进制 | 将字符串‘HTTP’取为二进制文件中b’\x48\x54\x54\x50’的过程。本质上讲,字符转成就是对应的ascii编码的过程 | 
4.1 bin十六进制与int互转实现
bin十六进制转int主要在分析二进制文件、数据包头时获取长度等值时使用;相反,int转bin十六进制就是在构造二进制文件、数据包头时写入长度等值时使用。
另外注意把bin十六进制当数值时有大端和小端两种模式,大端意思是开头(低地址)权重大,小端为开头(低地址)权重小。文件系统一般用小端模式,网络传输一般用大端模式。
| 转换 | 方法 | 说明 | 
| int转bin十六进制 | to_bytes(lenght,byteorder) | lenght表示转成的多少个字节;byteorder可为big或little分别表示转bin十六进制时使用大端模式还是小端模式 | 
| bin十六进制转int | int.from_bytes(byte_var,byteorder) | byte_var是要转成数值的变bin十六进制变量,byteorder还是一样可为big或little,分别表示从bin十六进制转为数值时把bin十六进制当大端模式还是小端模式处理 | 
举例:

将端口的对应的码流\xdc\x39转成56377
>>> int.from_bytes(b'\xdc\x39','big')
56377
>>>将56377转成码流\xdc\x39
>>> port = 56377
>>> byteFromInt = port.to_bytes(2,'big')
>>> byteFromInt
b'\xdc9'
>>> byteFromInt == b'\xdc\x39'
True转出来为什么是\xdc9,我们查一下ascii码表,9对应的十六进制就是\x39

4.2 bin十六进制和byte互转实现
bin十六进制转byte主要在分析二进制文件、数据包头时获取mac地址、密钥等平时就以十六进制表示的值时使用;相反,byte转bin十六进制就是在构造二进制文件、数据包头时写入mac地址、密钥等平时就以十六进制表示的值时使用。这在用scapy构造数据包或者转换数据包时会经常用到,这里要用到第三方库binascii,使用时需要先导入
| 转换 | 方法 | 说明 | 
| bin十六进制转byte | binascii.b2a_hex(bin_var) | bin_var为byte变量常从二进制文件中读出; 如binascii.b2a_hex(b’\x04\xf9\x38\xad\x13\x26’)结果为b’04f9381326‘ | 
| byte转bin十六进制 | binascii.a2b_hex(hex_byte_var) | hex_byte_var为十六进制字节串; 如binascii.a2b_hex(b’04f9381326’)结果为b’\x04\xf98\x13&’(8对应的ascii编码是38,&对应的ascii编码是26) | 
举例:
>>> import binascii
>>> binascii.b2a_hex(b'\x48\x6f\x73\x74\x3a\x20\x63') #bin十六进制转byte
b'486f73743a2063'
>>>
>>> binascii.a2b_hex(b'486f73743a2063') #byte转bin十六进制
b'Host: c'
>>>实际使用中我们经常会构造十六进制码流,然后将码流格式化成byte型,最后将byte转成bin十六进制

4.3 bin十六进制与str互转
bin十六进制转主要在分析二进制文件、数据包头时获取其量的字符串时使用;相反,byte转bin十六进制就是在构造二进制文件、数据包头时写入字符串时使用。
bin十六进制与str互转其实就是字符串和byte互转;此处的bin十六进制就是byte的本质。(b’\x48\x54\x54\x50’和b’HTTP’在内存中是一模一样的)
| 转换 | 方法 | 说明 | 
| bin十六进制转str | decode | 在第3节中有详细介绍 | 
| str转bin十六进制 | encode | 在第3节中有详细介绍 | 
举例:

>>> byteHost = b'\x48\x6f\x73\x74'
>>>
>>> byteHost.decode()
'Host'
>>>
>>> str = 'Host'
>>> str.encode()
b'Host'
>>>
相关文章:
 
Python常见类型转换合集
近期在工作中常常接触到各种转换,如字符串转byte,byte转字符串,还有byte数组转成报文能接纳的格式(bin格式的十六进制)。故有必要系统的总结一下Python中常见的类型转换。 一:常见类型的概念 类型举例说明…...
知识点(1)
什么是跨域请求? 当前发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是:我们认为若协议域名端口号均相同,那么就是同域。 get和…...
Tomcat源码分析-启动分析(三) Catalina启动
在上一篇文章中,我们分析了tomcat的初始化过程,是由Bootstrap反射调用Catalina的load方法完成tomcat的初始化,包括server.xml的解析、实例化各大组件、初始化组件等逻辑。那么tomcat又是如何启动webapp应用,又是如何加载应用程序的…...
 
程序员必备的软技能-金字塔原理拆解
前言 日常工作中,常常因为思维、表达方式不对产生不想要的结果: 写了一个小时的周报,领导却不满意?跟团队讲了半天自己的想法,可别人就是没理解?看了很多知识、信息,却一点也没记住࿱…...
 
基金详细介绍
投资回报率 利润 / 投资总额(第一次投资回报率 5%) 关注南方理财 60 天债券 B(202306)万元收益 50—60 元 购基七步曲: 风险测试基本知识交易指南查看业绩了解评级在线下单赎回 基金类型: 积极成长型基金…...
 
媒体邀约之企业如何加强品牌的宣传力度
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。胡老师分享了许多媒体传播方面的经验,今天就跟大家分享下我对企业宣传方面的看法。企业如何加强品牌的宣传力度:1,网络宣传在社交媒体上建立企业账户&am…...
【SpringBoot】75、SpringBoot中使用spring-retry轻松解决重试
在日常开发过程中,难免会与第三方接口发生交互,例如:短信发送、远程服务调用、争抢锁等场景,当正常调用发生异常时,例如:网络抖动,这些间歇性的异常在一段时候之后会自行恢复,程序为…...
网络工程师必知的几个问题
路由器问题: 1、什么时候使用多路由协议? 当两种不同的路由协议要交换路由信息时,就要用到多路由协议。当然,路由再分配也可以交换路由信息。下列情况不必使用多路由协议: 从老版本的内部网关协议( interi…...
 
【仓库管理】搭建 Maven 私服之一--Nexus仓库(Repository)管理软件
文章目录Nexus是什么Nexus下载和安装1. 进入 Nexus 2.x 下载页面,根据本机操作系统,选择对应的版本进行下载,如下图所示。2. 将下载 Nexus 安装包解压到本地磁盘,可获得 nexus-2.14.20-02 和 sonatype-work 2 个目录,如…...
 
凹凸贴图(Bump Mapping)
凹凸贴图是什么? 我们首先来看low-poly(多边形数较少)mesh和high-poly(多边形数量较多)mesh之间的不同。首先,最明显的不同就是high-poly能够表现出更多细节,但high-poly有比较大的性能开销。有…...
 
文华财经期货指标公式量化策略分析软件,多空共振信号准确率高的公式源码
期货指标公式信号本身就有滞后性,周期越大,滞后性越久。指标公式不是100%稳赚的工具,只是在合适的时候让我们理性看待行情,减少逆势操作。 多空量化三维系统是一款通过数学分析、挖掘价格运动规律,对历史价格走势、趋势…...
 
基于TCP协议的文件传输系统
最简单的一对一的服务端网络端通信(socket) Socket(IP地址:端口号),例如:如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23) socket可以理解成计算机提供给程序员的接…...
 
Linux定时备份MySql数据库
一、创建文件 cd / mkdir mysqlbackup vi mysqlbackup.sh然后将下面的代码更改后复制上去即可。 #!/bin/bash mysqldump -uroot -ppassword database > /mysqlbackup/database__$(date %Y%m%d_%H%M%S).sqlpassword指的是MySql的密码,database指的是所要备份的…...
JavaScript prototype(原型对象)
JavaScript 的原型(prototype)是 JavaScript 中的一个重要概念。它是一种特殊类型的对象,每个 JavaScript 对象都有一个原型对象。原型对象在 JavaScript 中起着非常重要的作用。本文将详细介绍 JavaScript 原型对象的作用和在实际工作中的用…...
 
pytorch各种版本最简单安装,不用自己安装cuda cudnn
pytorch各种版本 pip 安装命令 查看官网 https://pytorch.org/get-started/previous-versions/ conda pytorch 安装 1、安装conda, 2、创建并并激活虚拟环境 - conda create -n pytorch_1.7 python3.7 - conda activate pytorch_1.7 3、虚拟环境中 pip 安装想要的…...
 
订单超时处理方案介绍
在电商场景下,一个订单流程中有许多环节要用到超时处理,包括但不限于: 买家超时未付款:比如超过15分钟没有支付,订单自动取消。 商家超时未发货:比如商家超过1个月没发货,订单自动取消。 买家…...
Blackbox-Exporter对服务进行探活
前言 blackbox-exporter会对HTTP、HTTPS、DNS、TCP、ICMP和gRPC上的端点进行黑盒探测。 Blackbox-Exporter blackbox-exporter暴露两个Metrics指标接口,分别是 /metrics、/probe,两个接口返回不同监控目标的指标 Metrics接口 返回exporter的构建信息…...
 
react-redux
Redux 是js容器,用于进行全局的 状态管理它可以用在react, angular, vue等项目中, 但基本与react配合使用三大核心: 单一数据源 整个应用的state被存储在一棵 object tree中,并且这个 object tree只存在于一个唯一的 store 中 State是只读的…...
算法刷刷刷| 回溯篇| 子集问题大集合
78.子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1…...
 
合并两个有序数组-力扣88-java
一、题目描述给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合…...
 
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
 
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
 
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
 
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
 
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
