python常用的十进制、16进制、字符串、字节串之间的转换

整数之间的进制转换:

  • 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源码

[python]  view plain  copy
  1. ''''' 
  2. Created on 2014年8月21日 
  3.  
  4. @author: lenovo 
  5. '''  
  6. import binascii  
  7. import struct  
  8.   
  9.   
  10. def example(express, result=None):  
  11.     if result == None:  
  12.         result = eval(express)  
  13.     print(express, ' ==> ', result)  
  14.   
  15.   
  16. if __name__ == '__main__':  
  17.       
  18.     print('整数之间的进制转换:')  
  19.     print("10进制转16进制", end=': ');example("hex(16)")  
  20.     print("16进制转10进制", end=': ');example("int('0x10', 16)")  
  21.     print("类似的还有oct(), bin()")  
  22.       
  23.     print('\n-------------------\n')  
  24.       
  25.     print('字符串转整数:')  
  26.     print("10进制字符串", end=": ");example("int('10')")  
  27.     print("16进制字符串", end=": ");example("int('10', 16)")  
  28.     print("16进制字符串", end=": ");example("int('0x10', 16)")  
  29.       
  30.     print('\n-------------------\n')  
  31.       
  32.     print('字节串转整数:')  
  33.     print("转义为short型整数", end=": ");example(r"struct.unpack('<hh', bytes(b'\x01\x00\x00\x00'))")  
  34.     print("转义为long型整数", end=": ");example(r"struct.unpack('<L', bytes(b'\x01\x00\x00\x00'))")  
  35.   
  36.     print('\n-------------------\n')  
  37.   
  38.     print('整数转字节串:')  
  39.     print("转为两个字节", end=": ");example("struct.pack('<HH', 1,2)")  
  40.     print("转为四个字节", end=": ");example("struct.pack('<LL', 1,2)")  
  41.       
  42.     print('\n-------------------\n')  
  43.       
  44.     print('字符串转字节串:')  
  45.     print('字符串编码为字节码', end=": ");example(r"'12abc'.encode('ascii')")  
  46.     print('数字或字符数组', end=": ");example(r"bytes([1,2, ord('1'),ord('2')])")  
  47.     print('16进制字符串', end=': ');example(r"bytes().fromhex('010210')")  
  48.     print('16进制字符串', end=': ');example(r"bytes(map(ord, '\x01\x02\x31\x32'))")  
  49.     print('16进制数组', end =': ');example(r'bytes([0x01,0x02,0x31,0x32])')  
  50.       
  51.     print('\n-------------------\n')  
  52.       
  53.     print('字节串转字符串:')  
  54.     print('字节码解码为字符串', end=": ");example(r"bytes(b'\x31\x32\x61\x62').decode('ascii')")  
  55.     print('字节串转16进制表示,夹带ascii', end=": ");example(r"str(bytes(b'\x01\x0212'))[2:-1]")  
  56.     print('字节串转16进制表示,固定两个字符表示', end=": ");example(r"str(binascii.b2a_hex(b'\x01\x0212'))[2:-1]")  
  57.     print('字节串转16进制数组', end=": ");example(r"[hex(x) for x in bytes(b'\x01\x0212')]")  
  58.       
  59.       
  60.     print('\n===================\n')  
  61.     print("以上原理都比较简单,看一下就明白了。这里仅仅是抛砖引玉,有更好更简单的方法,欢迎欢迎")  
<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]。 如果您有具体的十六进制数据示例或特殊需求(如处理前缀或大端序),请提供更多细节,我可以优化解决方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值