CS机器人字节数据与整数/浮点数转换


CS机器人可以通过指令socket_read_byte_list(4) 读取定长的字节数组。

例如上位机发来的数据是0x3F,0x80,0x00,0x00,则通过socket_read_byte_list(4) 接收到数据为[4,63,128,0,0](第一个数据为接收到的数据长度,若后续数据有未接收到的,则对应值为-1)


对于收到的数组,可以根据用户定义的类型(float,int16/int32)进行解析。

如果要将float,int16/int32等类型拆分成字节数组,也可以使用以下代码进行拆分,并使用指令socket_send_byte_list([1, 0x3, 0x2E, 3])进行发送

import struct
def Bytes2Float(d,BigEndian=False):
    # 输入4个字节数据,转化为对应的32位的实数,默认使用小端编码,使用大端编码添加参数BigEndian为True
    if BigEndian ==True:
        return struct.unpack('<f', struct.pack('4B', *d))[0]
    else:
        return struct.unpack('>f', struct.pack('4B', *d))[0]

def Bytes2Int32(d,BigEndian=False):
    # 输入4个字节数据,转化为对应的32位的带符号整数,默认使用小端编码,使用大端编码添加参数BigEndian为True
    if BigEndian ==True:
        return struct.unpack('<i', struct.pack('4B', *d))[0]
    else:
        return struct.unpack('>i', struct.pack('4B', *d))[0]

def Bytes2Int16(d,BigEndian=False):
    # 输入2个字节数据,转化为对应的16位的带符号整数,默认使用小端编码,使用大端编码添加参数BigEndian为True
    if BigEndian ==True:
        return struct.unpack('<h', struct.pack('2B', *d))[0]
    else:
        return struct.unpack('>h', struct.pack('2B', *d))[0]


def Float2Bytes(d,BigEndian=False):
    # 输入32位的实数,转化位对应4个字节数据,默认使用小端编码,使用大端编码添加参数BigEndian为True
    if BigEndian ==True:
        return list(struct.unpack('4B',struct.pack('f',d)))
    else:
        return list(struct.unpack('4B',struct.pack('>f',d)))

def Int322Bytes(d,BigEndian=False):
    # 输入32位带符号整数,转化位对应4个字节数据,默认使用小端编码,使用大端编码添加参数BigEndian为True
    if BigEndian ==True:
        return list(struct.unpack('4B',struct.pack('<i',d)))
    else:
        return list(struct.unpack('4B',struct.pack('>i',d)))

def Int162Bytes(d,BigEndian=False):
    # 输入16位带符号整数,转化位对应2个字节数据,默认使用小端编码,使用大端编码添加参数BigEndian为True
    if BigEndian ==True:
        return list(struct.unpack('2B',struct.pack('<h',d)))
    else:
        return list(struct.unpack('2B',struct.pack('>h',d)))

a = Float2Bytes(1.0)
# 默认使用小端编码,输出数据如下
# a = [0x3F,0x80,0x00,0x00]

a = Float2Bytes(1.0,True)
# 使用大端编码,输出数据如下
# a = [0x00,0x00,0x80,0x3F]

b = Bytes2Float( [0x3F,0x80,0x00,0x00])
# 默认使用小端编码,输出数据如下
# b = 1.0

b = Bytes2Float( [0x3F,0x80,0x00,0x00],True)
# 使用大端编码,输出数据如下
# b = 4.600602988224807e-41
点击显示全文
赞同0
发表评论
分享

手机扫码分享
0
348
收藏
举报
收起
登录
  • 密码登录
  • 验证码登录
还没有账号,立即注册
还没有账号,立即注册
注册
已有账号,立即登录
选择发帖板块
举报
请选择举报理由
举报
举报说明