标签:varchar stream int 数据类型 bytes 互转 转换 byte
常用数据类型和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'
"""
标签:varchar,stream,int,数据类型,bytes,互转,转换,byte 来源: https://www.cnblogs.com/caodingzheng/p/16675968.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。