您现在的位置是: 网站首页> 学习笔记> python python

python有符号十六进制与十进制的相互转换

2022-04-15 3845人已围观

最近在使用ros2, python-can对接can协议时,需要用到进制转换的功能, 用python自带的转换工具转换出来不太对,目前主要体现在负数的转换上。 如对接文档上的-50: 在网上查了很多资料,找到一篇可用的文章,对代码做了细微的调整,记录下以备后用:

def hex2bin(hex_str: str, bin_width: int = -1):
    hex_str = hex_str.strip()
    if hex_str[0] in ['+', '-', '_'] or hex_str[-1] == '_' or '__' in hex_str:
        print('输入不合法,必须为16进制补码,不允许带正负号,首尾不能是下划线,不能连续出现两个下划线')
    elif hex_str[:2].lower() == '0x':
        hex_str = hex_str[2:]
    hex_str = hex_str.replace('_', '')
    bin_str = ''.join([oneHex2fourBin(s) for s in hex_str])

    for i in range(len(bin_str) - 1):
        if bin_str[i + 1] == bin_str[0]:
            if i + 1 == len(bin_str) - 1:
                bin_str = bin_str[i:]
            else:
                continue
        else:
            bin_str = bin_str[i:]
            break
    if bin_str == '00':
        bin_str = '0'
    if bin_width == -1:
        pass
    elif bin_width < len(bin_str):
        print('位宽参数<16进制补码,请修正位宽')
    else:
        bin_str = bin_str[0] * (bin_width - len(bin_str)) + bin_str
    return '0b' + bin_str


def dec2hex(self, data: int):
    return hex(data % 256)


def bin2dec(bin_str: str):
    bin_str = bin_str.strip()
    if bin_str[:2] == '0b':
        if bin_str[2] == '_':
            bin_str = bin_str[3:]
        else:
            bin_str = bin_str[2:]
    if bin_str[0] == '_':
        print('输入不合法,首字符不能是下划线,且不允许出现连续两个下划线')
    elif bin_str[0] == '0':
        return int(bin_str, base=2)
    elif bin_str[0] == '1':
        a = int(bin_str, base=2)
        bin_str = bin_str.replace('_', '')
        return a - 2 ** len(bin_str)
    else:
        print('输入不合法,必须为2进补码,不允许带正负号')


def oneHex2fourBin(one_hex: str):
    raw = {'A': '1010', 'B': '1011', 'C': '1100', 'D': '1101', 'E': '1110', 'F': '1111'}
    if one_hex in [str(i) for i in range(10)]:
        return '{:0>4}'.format(str(bin(int(one_hex)))[2:])
    elif one_hex.upper() in ['A', 'B', 'C', 'D', 'E', 'F']:
        return raw[one_hex.upper()]
    else:
        print('十六进制格式错误, 只能包含0~9, a~f,A~F')


if __name__ == '__main__':
    print(bin2dec(hex2bin('0xce')))

相关文章

文章评论

暂无评论

添加评论





本栏推荐

站点信息

  • 建站时间:2021-01-01
  • 网站程序:Django 3.1.2
  • 文章统计:53篇
  • 文章评论:31条
  • 统计数据