常用数据类型和bytes数组互转
常用数据类型和bytes数组互转
简介
常用于tcp和udp传输,通过约定协议进行数据交互
示例
1、在Python中一般用struct库进行常见的转换,主要对数字进行处理,包括int、float等
import struct
# int转换为bytes
s = 1
s = struct.pack('i', s)
# 再将bytes转换为int
s = struct.unpack('i', s)[0]
# float转为bytes
s = 1
s = struct.pack('f', s)
# 字节长度为1转换
s = b'a'
v = b'c'
a = struct.pack('2c', s, v)
b = struct.pack('cc', s, v)
# 组装可以使用+进行组装成字节流
# 需要注意的是自动补位,这有时并不是我们想要的,如:
a = 1
b = 2
s = struct.pack('bh', a, b)
# 我们想要的是3个字节长度,但事实上补了一位,成了4个字节,这时我们就需要将其拆开,分开进行转换
2、char、varchar和bytes互转
"""
python没有char和varchar,只有str
需要先将str通过ord函数转为数字,再通过int.to_bytes函数转为字节
int.to_bytes第一个参数是字节长度,char为1,varchar为2,第二个参数为大端或者小端,入参为big、little
Python将bytes转换为char或者varchar需要通过int.from_bytes函数将bytes转换为数字,再通过chr函数换为char或者varchar
int.from_bytes第一个入参为bytes,第二个入参为大端或者小端,入参为big、little
"""
# char转换为bytes
a = 'a'
a = ord(a)
a = a.to_bytes(1, 'big')
print(a)
# bytes转换为char
a = int.from_bytes(a, 'big')
a = chr(a)
print(a)
# varchar和bytes互转,varchar为大端
def varchar_to_byte(value):
"""
将varchar转换为byte
:param value:
:return:
"""
bytes_stream = b''
for i in value:
byte_stream = ord(i)
byte_stream = byte_stream.to_bytes(2, 'big')
bytes_stream += byte_stream
return bytes_stream
def byte_to_varchar(byte_stream):
"""
将byte转换为varchar
:param byte_stream:
:return:
"""
value = ''
i = 0
while True:
s = byte_stream[i:i+2]
s = int.from_bytes(s, 'big')
s = chr(s)
i += 2
value += s
if i >= len(byte_stream):
break
return value
3、str和bytes互转
"""
java和Python的str转为都是通过encode函数进行转换,现在一般默认约定通过utf-8格式转换,中文在utf-8中为3个字节,英文、数字为1个字节
bytes转换为str用decode函数
另外str通过GBK转换为bytes为2个字节,但是和varchar不能互转
"""
# str转换为bytes
a = '测试'
b = 'abc1'
a = a.encode()
print(len(a))
b = b.encode()
print(len(b))
a = '测试'
b = 'abc1'
s = a + b
s = s.encode()
print(len(s))
4、int.to_bytes()函数转换,大端和小端
"""
struct中int类型转为bytes类型一般为小端,但是我们有时用到的是大端,所以有时通过int.to_bytes()转换,当然也有其他情况用到该函数
"""
a = 1
s = a.to_bytes(4, 'little')
print(s)
"""
结果:b'\x01\x00\x00\x00'
"""
s2 = a.to_bytes(4, 'big')
print(s2)
"""
结果:b'\x00\x00\x00\x01'
"""