常用数据类型和bytes数组互转

16 篇文章 0 订阅
3 篇文章 0 订阅

常用数据类型和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'
"""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值