python 通信协议16进制高4位低4位转ASCII码

遇到一个通信协议,需要将16 进制的高 4 位和低 4 位用ASCII 码表示。

如地址为 0x01 时,16 进制的高 4 位和低 4 位 ASCII 码表示为‘0’和‘1’,对应 16 进制表示为 0x30 和 0x31;

在这里插入图片描述
ASCII与16进制对应关系参考:ASCII与16进制对应关系

接下来将用python 实现

1.16进制高4位低4位转ASCII码

'''
输入:HexValue 十六进制数
输出:对应的高位hex(AsciiTop)和低位hex(AsciiBtm)的ASCII码
'''
def HexToAscii_SendTopBtm(HexValue):

    HexTop = int(HexValue / 16)
    HexBtm = int(HexValue % 16)

    if HexTop >= 0 and HexTop <= 9:
        AsciiTop = HexTop + 0x30
    elif (HexTop>=10) and (HexTop<=15):
        AsciiTop = HexTop + 0x37
    else:
        AsciiTop = 0xff

    if HexBtm >= 0 and HexBtm <= 9:
        AsciiBtm = HexBtm + 0x30
    elif (HexTop>=10) and (HexBtm<=15):
        AsciiBtm = HexBtm + 0x37
    else:
        AsciiBtm = 0xff

    print("AsciiTop:", hex(AsciiTop))
    print("AsciiBtm:", hex(AsciiBtm))

测试代码:

如:
HexToAscii_SendTopBtm(0x01)

输出:
AsciiTop: 0x30
AsciiBtm: 0x31

如:
HexToAscii_SendTopBtm(0xB1)

输出:
AsciiTop: 0x42
AsciiBtm: 0x31

2.一个10进制数转16进制再高4位低4位转ASCII码

'''
输入:十进制数
输出:对应的高位hex(AsciiTop)和低位hex(AsciiBtm)的ASCII码
'''
def byte_encoding(x):
    list_x = [x]  #这里可以改为多个数所以用list
    result = []
    for data in list_x:
        if data < 0:
            data = -data  # 取反 int 19
            data = data | 0x8000  # 将其最高位转换为1
            data = bin(data)  # 10进制转换为二进制
            data_bin = data[2:]  # 去掉‘0b'前缀
            vv = []
            for i in data_bin:
                if i == '1':  # 对每一位取反,即1变为0
                    v = 0
                    vv.append(v)
                else:  # 0变1
                    v = 1
                    vv.append(v)
            s = ''
            for i in vv:
                s = s + str(i)
            aa = int(s, 2)  # 将字符串二进制数变成整型
            aa = aa + 1
            aa = aa | 0x8000  # 将其最高位转换为1
            aa_value = bin(aa)  # 10进制转换为二进制
            data_aft = aa_value[2:]  # 去掉‘0b'前缀
        else:
            data = bin(data)  # 10进制转换为二进制 str 0b10011
            data = data[2:]  # 去掉‘0b'前缀
            data_aft = ""
            if len(data) < 8:  # 补齐0位
                while len(data) < 8:
                    data = str(0) + data
            data_aft += data  # 补齐0以后的字符串 str 0000000000010011
        # int() 函数 ,第一个参数是字符串,第二个参数是说明,这个字符串是几进制的数
        data_H = int(data_aft[0:4], 2)  # int 128 ~ 1000 0000
        result.append(data_H)
        data_L = int(data_aft[4:9], 2)  # int 19 ~ 0001 0011
        result.append(data_L)
    return result

def HexToAscii_SendTopBtm(HexValue):
    HexTop = HexValue[0]
    HexBtm = HexValue[1]

    if HexTop >= 0 and HexTop <= 9:
        AsciiTop = HexTop + 0x30
    elif (HexTop>=10) and (HexTop<=15):
        AsciiTop = HexTop + 0x37
    else:
        AsciiTop = 0xff

    if HexBtm >= 0 and HexBtm <= 9:
        AsciiBtm = HexBtm + 0x30
    elif (HexTop>=10) and (HexBtm<=15):
        AsciiBtm = HexBtm + 0x37
    else:
        AsciiBtm = 0xff

    print("AsciiTop:", hex(AsciiTop))
    print("AsciiBtm:", hex(AsciiBtm))

测试代码:

如:
hex_topbtm = byte_encoding(1)
HexToAscii_SendTopBtm(hex_topbtm)

输出:
AsciiTop: 0x30
AsciiBtm: 0x31

如:
hex_topbtm = byte_encoding(177)  # 0xB1对应177
HexToAscii_SendTopBtm(hex_topbtm)

输出:
AsciiTop: 0x42
AsciiBtm: 0x31
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值