2017-02-09 97 views
4

切片十六进制字符串比方说,我有一个十六进制字符串:的地址范围

EPC = '00000800031C1060EC9FBD3C00000000' 

规范文件规定了不同领域的字符串代表的地址范围。对于例如地址范围48h-53h(12bits),代表'代理'字段。我知道(根据经验),这代表了六进制字符串EPC中的3个半字节“1C1”。

同样,我也希望能够在其他领域与他们指定的地址范围进行解码,所以我的问题是:

如何使用的地址范围信息在规范中提取它从十六进制串值表示半字节,EPC ?更具体地讲,我要找下列类型的函数:

def fun(addressrangeinhex,bits, hexstring): 
    # addressrangeinhex is 48h-53h in my example above 
    # hexstring is EPC string in my example above 
    # bits is 12 bits in my example above 
    return rangeofindexinhexstring 

因此,使用功能为我的例子中,我应该得到的(指数= 10,指数= 12)。

+0

为什么你需要'bits'当你的范围内?这不是多余的吗? – samgak

+0

是的。这只是为了保持api与规范一致 – Imran

+0

EPC是什么?某种变量/常量? –

回答

1

该解决方案需要指定比特使用从说明书中的字符串中提取的方法。即:'48h-53h'。预计这些寄存器位的十六进制值也是一个字符串。此外,此函数可以获取不在半边界上的值。

代码:

def get_sub_register_value(sub_reg_bits_addr, bit_string): 
    """ 
    Given a register address description string, and a register value 
    string, return the bits from the value described by the address 

    :param sub_reg_bits_addr: string of the form '48h-53h' 
    :param bit_string: register value string of the form, 
     '00000800031C1060EC9FBD3C00000000' 
    :return: returns string of sub register: eg 
    """ 
    start, end = (int(x[:-1], 16) for x in sub_reg_bits_addr.split('-')) 
    value = int(bit_string, 16) 
    mask = (1 << (end - start + 1)) - 1 
    return ("%x" % ((value >> start) & mask)).upper() 

测试数据:

EPC = '00000800031C1060EC9FBD3C0000000' 
agency = '48h-53h' 
pattern = 'FEDCBA' 

assert get_sub_register_value(agency, EPC) == '1C1' 
assert get_sub_register_value('0h-3h', pattern) == '0' 
assert get_sub_register_value('1h-4h', pattern) == '8' 
assert get_sub_register_value('5h-8h', pattern) == '0' 
assert get_sub_register_value('5h-9h', pattern) == '10' 
assert get_sub_register_value('4h-9h', pattern) == '21' 
assert get_sub_register_value('3h-9h', pattern) == '42' 
2

有它在比特串和索引有:

bits = '{0:0128b}'.format(int(EPC,16)) 
agency = int(bits[40:52],2) 

print(hex(agency)) # 1C1 
+0

40和52哪里来?看起来这些是请求者所要求的数字,一旦我们拥有了它们,我们甚至可以在没有过度转换的情况下做到这一点 - EPC [40/4:52/4] – ffeast