2017-02-09 3 views
4

のは、私が16進文字列があるとしましょう:アドレス範囲で16進文字列をスライス

EPC = '00000800031C1060EC9FBD3C00000000' 

仕様書は、文字列が表す異なるフィールドのアドレス範囲を指定します。例えば、アドレス範囲48h-53h(12bits)は、 'agency'フィールドを表します。私は(経験から)これがhexstring EPCの3ニブル "1C1"を表していることを知っています。

同様に、私は私の質問があるので、自分の指定したアドレス範囲に他のフィールドをデコードすることができるようにしたい:EPC、

私はhexstringからそれが表すニブルを抽出するための仕様でアドレス範囲の情報を使用するにはどうすればよい

?だから私は(インデックス= 10、インデックス= 12)を取得する必要があります私の例のための機能を使用して

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 

:具体的には、私は以下のタイプの機能を探しています。

+0

は、なぜあなたは 'bits'が必要なのでしょうか?冗長ではないですか? – samgak

+0

はい、そうです。それは、APIと仕様との整合性を保つことです。 – Imran

+0

'EPC 'とは何ですか?ある種の変数/定数? –

答えて

1

この溶液は、仕様からの文字列を使用して抽出するビットを特定のアプローチを取ります。すなわち:'48h-53h'。それらのレジスタビットを抽出するための16進値も文字列であると予想されます。さらに、この関数はニブル境界にない値を取得できます。

コード:

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

どこから来るのですか?リクエスタが要求している数字ですが、いったんビットトランスフォームを行わなくてもこのトリックを行うことができたら、EPC [40/4:52/4] – ffeast

関連する問題