Python 常用数据转换

本文详细介绍了Python中base64、binascii模块的使用,以及bytes字节串的各种转换方法,包括字符串与bytes之间的相互转换、Hex字符串与bytes的转换,并展示了在ctypes和IntList中的应用。
摘要由CSDN通过智能技术生成

一、Python base64使用

base64是Python内置的库

1、对bytes类型进行base64编码

import base64
a = "我的世界"
base64.b64encode(a.encode()) # b'5oiR55qE5LiW55WM',必须是bytes类型输入

2、base64编码转bytes类型

import base64
base64.b64decode(b'5oiR55qE5LiW55WM') # b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'-->我的世界

二、Python binascii的使用

binascii模块包含很多在二进制和ASCII编码的二进制表示转换的方法。通常情况不会直接使用这些功能,而是使用像UU,base64编码,或BinHex封装模块。 binascii模块包含更高级别的模块使用的,用C语言编写的低级高效功能。

# 返回二进制数据data的十六进制的表达形式。3个方式
binascii.b2a_hex(data)	# 每个字节转换为2位十六进制表示形式,依旧是bytes类型
binascii.hexlify(data)	# 同binascii.b2a_hex
data.hex()				# 返回Hex字符串

# 返回十六进制字符串hexstr表示的二进制数据
binascii.a2b_hex(hexstr) 	# 必须包含偶数个16进制数据
binascii.unhexlify(hexstr)	# 必须包含偶数个16进制数据

1、Hex字符串转bytes类型

binascii.a2b_hex()

import binascii
a = "我的世界"
b = bytes(a,'utf8')		# b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'
c = b.hex().upper()		# 'E68891E79A84E4B896E7958C'
binascii.a2b_hex(c)		# b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'
binascii.unhexlify(c)	# b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'

2、bytes类型转Hex字符串

import binascii
 
data = b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c' # 我的世界
# 方式1
binascii.b2a_hex(data) 	# b'e68891e79a84e4b896e7958c'
#方式2
binascii.hexlify(data)	# b'e68891e79a84e4b896e7958c'
#方式3
data.hex().upper()		# 'E68891E79A84E4B896E7958C'

三、Python bytes字节串

​ bytes 只负责以字节序列的形式(二进制形式)来存储数据,至于这些数据到底表示什么内容(字符串、数字、图片、音频等),完全由程序的解析方式决定。如果采用合适的字符编码方式(字符集),字节串可以恢复成字符串;反之亦然,字符串也可以转换成字节串。

​ bytes 只是简单地记录内存中的原始数据,至于如何使用这些数据,bytes 并不在意,你想怎么使用就怎么使用,bytes 并不约束你的行为。

1、字符串转bytes

  • bytes 是一个类,调用它的构造方法,也就是 bytes(),可以将字符串按照指定的字符集转换成 bytes,必须指定字符集

  • 字符串本身有一个 encode() 方法,该方法专门用来将字符串按照指定的字符集转换成对应的字节串;如果不指定字符集,那么默认采用 UTF-8。

# 方式1:字符串的encode方法
b1 = "我的世界".encode('utf8') # 
# b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'

# 方式2:bytes方法
b2 = bytes("我的世界","utf8") # b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'

2、bytes转Hex字符串

# bytes.hex()
b2.hex()		    # e68891e79a84e4b896e7958c
b2.hex().upper()	# E68891E79A84E4B896E7958C

3、bytes转string字符串

# bytes.decode(),不指定字符集,则默认为utf8
b2.decode()	# '我的世界'

4、bytes与ctypes

# 可以将ctypes类型数据转成bytes类型
a = c_ulong(10)	  	 # 4个字节
b = bytes(a)	  	# b'\n\x00\x00\x00'
list(b)			 	# 每个字节转成一个int元素

# ctypes结构体
class Test(Structure):
    _fields_ = [("X", c_ulong),
                ("Y", c_ubyte * 3),
                ("Z", c_ubyte * 3)]
test = Test(10,(1,2,3),(4,5,6))  # 声明变量
# 为cs_ecc_blob赋值
test.X	# 10
test.Y	# <__main__.c_ubyte_Array_3 object at 0x00000269503ECE40>
test.Y[:] # [1,2,3]
b_test = bytes(test) # b'\n\x00\x00\x00\x01\x02\x03\x04\x05\x06\x00\x00'
list(b_test)		# [10, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0]

'''
将bytes类型数据转成结构体
p_test = POINTER(Test)
cs_test = cast(b_test,p_test)[0]  # 不获取[0],表示是一个指针,指针指向的第一个地址就是Test的数据
cs_test.X ->10
cs_test.Y ->[1,2,3]
'''

5、bytes类型与IntList

将bytes类型转成int类型列表(元组),每个字节转成一个int

# 我的世界
a = "我的世界".encode() # b'\xe6\x88\x91\xe7\x9a\x84\xe4\xb8\x96\xe7\x95\x8c'
list(a) = [230, 136, 145, 231, 154, 132, 228, 184, 150, 231, 149, 140]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值