一篇搞定:Python常用的十进制、16进制、字符串、字节串之间的转换

本文介绍了Python中常见的十进制、16进制、字符串与字节串之间的转换方法,包括int()、hex()、bin()、struct.unpack()、encode()、decode()等函数的使用,帮助读者理解并掌握数据类型转换。

人生苦短,我用python

进行协议解析时,

总是会遇到各种各样的数据转换的问题,

从二进制到十进制,从字节串到整数等等

在这里插入图片描述

废话不多上,直接上例子

整数之间的进制转换:

10进制转16进制: hex(16) ==> 0x10

16进制转10进制: int(‘0x10’, 16) ==> 16

类似的还有oct(), bin()


字符串转整数:

10进制字符串: int(‘10’) ==> 10

16进制字符串: int(‘10’, 16) ==> 16

16进制字符串: int(‘0x10’, 16) ==> 16


字节串转整数:

转义为short型整数: struct.unpack(‘<hh’, bytes(b’\x01\x00\x00\x00’)) ==> (1, 0)

转义为long型整数: struct.unpack(‘<L’, bytes(b’\x01\x00\x00\x00’)) ==> (1,)


整数转字节串:

转为两个字节: struct.pack(‘<HH’, 1,2) ==> b’\x01\x00\x02\x00’

转为四个字节: struct.pack(‘<LL’, 1,2) ==> b’\x01\x00\x00\x00\x02\x00\x00\x00’


字符串转字节串:

字符串编码为字节码: ‘12abc’.encode(‘ascii’) ==> b’12abc’

数字或字符数组: bytes([1,2, ord(‘1’),ord(‘2’)]) ==> b’\x01\x0212’

16进制字符串: bytes().fromhex(‘010210’) ==> b’\x01\x02\x10’

16进制字符串: bytes(map(ord, ‘\x01\x02\x31\x32’)) ==> b’\x01\x0212’

16进制数组: bytes([0x01,0x02,0x31,0x32]) ==> b’\x01\x0212’


字节串转字符串:

字节码解码为字符串: bytes(b’\x31\x32\x61\x62’).decode(‘ascii’) ==> 12ab

字节串转16进制表示,夹带ascii: str(bytes(b’\x01\x0212’))[2:-1] ==> \x01\x0212

字节串转16进制表示,固定两个字符表示: str(binascii.b2a_hex(b’\x01\x0212’))[2:-1] ==> 01023132

字节串转16进制数组: [hex(x) for x in bytes(b’\x01\x0212’)] ==> [‘0x1’, ‘0x2’, ‘0x31’, ‘0x32’]

===================

测试用的python源码

import binascii
import struct
 
 
def example(express, result=None):
    if result == None:
        result = eval(express)
    print(express, 
<think>首先,用户的问题是:“我想将16进制数据转换字符串和数字 请问Python十六进制数据转换字符串整数”。我需要用中文回答,因为系统指令指定了使用中文。 关键点: - 用户想将十六进制数据转换字符串整数。 - 在Python中实现。 根据系统指令: - 行内数学表达式使用$...$,但这里可能不需要数学表达式。 - 独立公式使用$$...$$,但可能不适用。 - LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,逐步解决问题。 - 参考提供的引用内容,但用户提供的引用是关于十六进制转换的,所以我应该基于这些来回答。 用户提供的引用: - [^1]: 展示了使用int('ff', 16)将十六进制字符串转换十进制整数,以及hex(255)将十进制整数转换十六进制字符串。还提到了binascii模块用于ASCII和十六进制之间转换。 - [^2]: 讨论了将十六进制字符串转换为二进制字符串的方法。 - [^3]: 描述了将十六进制字符串转换整数的过程,包括反转序列。 用户的问题是将十六进制数据转换字符串整数。这里的“字符串”可能指的是ASCII字符串或原始字符串,“数字”指的是整数。 分解: 1. 十六进制数据转换整数:使用int(hex_string, 16)。 2. 十六进制数据转换字符串:这可能意味着将十六进制表示转换为可读的字符串(如ASCII),或者直接作为字符串处理。 在上下文中: - 如果十六进制数据是表示ASCII字符十六进制字符串,那么可以使用binascii.unhexlify或bytes.fromhex来转换字符串。 - 如果用户有十六进制字符串如"48656C6C6F",这代表"Hello",那么转换字符串就是"Hello"。 - 转换整数就是将该十六进制字符串解释为数字。 用户说“转换字符串和数字”,所以可能两者都需要。 参考引用: - [^1] 提到int('ff', 16) -> 255(整数)和hex(255) -> '0xff'(字符串)。 - 也提到binascii.b2a_hex('A') -> '41'(十六进制字符串)和binascii.a2b_hex('41') -> 'A'(ASCII字符串)。 所以,我应该覆盖: - 将十六进制字符串转换整数:使用int(hex_str, 16)。 - 将十六进制字符串转换为ASCII字符串:使用binascii.unhexlify或bytes.fromhex().decode()。 用户说“十六进制数据”,可能是一个字符串如"1a"或字节数据。 在Python中,十六进制数据通常表示为字符串(如"FF")或字节对象。 为了清晰,假设输入是十六进制字符串。 步骤: 1. **转换整数**:使用int()函数。 2. **转换字符串**:如果指的是ASCII字符串,使用解码方法。 回答结构: - 介绍问题。 - 分步解释。 - 提供代码示例。 - 确保真实可靠。 - 末尾生成相关问题。 生成相关问题:系统指令要求在回答末尾添加相关问题,如示例所示。 引用标识:在回答中如果引用内容,添加引用标识。但用户提供的引用是给定的,所以我应该在相关部分引用它们。 例如,当提到int(hex_str, 16)时,引用[^1]或[^3]。 构建回答: - **开头**:简要解释。 - **部分1**:将十六进制数据转换整数。 - **部分2**:将十六进制数据转换字符串(ASCII字符串)。 - **部分3**:可能其他转换,如直接作为字符串处理。 - **代码示例**:提供Python代码。 - **结尾**:生成相关问题。 代码示例: - 转换整数:num = int(hex_str, 16) - 转换为ASCII字符串:如果hex_str是"48656C6C6F",则str = bytes.fromhex(hex_str).decode('ascii') 确保使用中文。 生成相关问题: - 类似于示例,如: 1. 如何在Python中将整数转换十六进制字符串? 2. 如何处理非ASCII字符十六进制转换? 3. 十六进制转换在什么场景下常用? 引用: - 当使用int()时,引用[^1]或[^3]。 - 当使用bytes.fromhex时,可能引用[^2]或标准库文档,但用户没有提供直接引用,所以我应该基于给定的引用。 用户引用[^2]是关于转换为二进制的,不直接相关。[^3]是关于转换整数的。 所以,主要引用[^1]和[^3]。 最终回答结构: - 回答部分。 - §§相关问题§§部分。</think>### Python十六进制数据转换字符串整数Python 中,将十六进制数据转换字符串整数是常见的操作,尤其在处理网络协议、数据编码或文件解析时。十六进制数据通常以字符串形式表示(如 `"FF"` 或 `"48656C6C6F"`),我将逐步解释如何实现转换,确保代码简洁高效。以下内容基于 Python 标准库,无需额外安装模块。 #### 1. **将十六进制数据转换整数** - **原理**:使用 Python 内置的 `int()` 函数,指定基数(base)为 16,将十六进制字符串直接解析为十进制整数。 - **代码示例**: ```python # 输入十六进制字符串 hex_str = "FF" # 转换整数 integer_value = int(hex_str, 16) print(f"整数结果: {integer_value}") # 输出: 整数结果: 255 ``` - **说明**: - `int(hex_str, 16)` 中的 `16` 表示输入是十六进制格式。 - 此方法适用于任意长度的十六进制字符串,如 `int("1A3F", 16)` 会得到 `6719`。 - 如果输入包含前缀(如 `"0xFF"`),需先去除前缀(例如 `hex_str.lstrip("0x")`),否则会引发错误[^1][^3]。 #### 2. **将十六进制数据转换字符串** - **原理**:如果十六进制数据表示的是 ASCII 字符(如 `"48656C6C6F"` 对应 `"Hello"`),可以使用 `bytes.fromhex()` 将字符串转换为字节对象,再通过 `decode()` 解码为普通字符串。如果不需要解码,直接将十六进制数据作为字符串处理即可。 - **代码示例**: ```python # 示例1: 转换为 ASCII 字符串(适用于可打印字符) hex_str = "48656C6C6F" # 代表 "Hello" # 先转换为字节,再解码为字符串 byte_data = bytes.fromhex(hex_str) string_value = byte_data.decode('utf-8') # 或 'ascii' print(f"字符串结果: {string_value}") # 输出: 字符串结果: Hello # 示例2: 保留原始十六进制字符串(不转换内容) hex_str = "FF" string_value = hex_str # 直接赋值即可 print(f"原始字符串: {string_value}") # 输出: 原始字符串: FF ``` - **说明**: - `bytes.fromhex()` 方法要求输入字符串长度必须为偶数(每个字节由两个十六进制字符表示),否则会报错。例如,`"A"` 需改为 `"0A"`[^1][^2]。 - 解码时使用 `decode('utf-8')` 或 `decode('ascii')`,确保编码匹配数据源。如果数据包含非 ASCII 字符(如中文),需指定正确的编码(如 `'utf-8'`)。 - 对于非字符串数据(如二进制),可直接使用 `bytes.fromhex()` 获取字节对象,而不解码。 #### 3. **完示例:同时转换整数字符串** 以下代码展示如何从一个十六进制字符串获取整数和 ASCII 字符串: ```python def hex_conversion(hex_data): """将十六进制数据转换整数和 ASCII 字符串""" # 转换整数 integer_value = int(hex_data, 16) # 转换为 ASCII 字符串(假设数据是 ASCII 编码) try: byte_data = bytes.fromhex(hex_data) string_value = byte_data.decode('ascii') except ValueError: string_value = "无法解码: 非 ASCII 数据" return integer_value, string_value # 测试 hex_input = "48656C6C6F" # "Hello" 的十六进制 num, text = hex_conversion(hex_input) print(f"整数: {num}, 字符串: {text}") # 输出: 整数: 310939249775, 字符串: Hello ``` #### 注意事项 - **错误处理**:添加异常捕获(如 `try-except`)来处理无效输入,例如: - 如果十六进制字符串包含非十六进制字符(如 `"FG"`),`int()` 会抛出 `ValueError`。 - 如果字符串长度不是偶数,`bytes.fromhex()` 会报错。 - **性能**:这些方法效率高,适用于大多数场景。对于大数据量,使用 `binascii.unhexlify()`(类似 `bytes.fromhex()`)可能更高效[^1]。 - **引用说明**:以上方法基于 Python 标准库文档和社区最佳实践[^1][^2][^3]。 如果您有具体的十六进制数据示例或特殊需求(如处理前缀或大端序),请提供更多细节,我可以优化解决方案!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值