3

私は一般的に16進数にかなり慣れていないので、16進数を分割する必要があるアプリケーションがあります。たとえば、数値が0x607Fの場合、上位(0x60)または下位(0x7F)バイトを返す必要があります。

これは実装かもしれませんが、少し不器用に感じます。Pythonでこれを行うためのより標準的な方法はありますか?

def byte(integer,highlow):
    assert highlow=='high' or highlow=='low'
    if highlow=='high':
        return hex(int(bin(integer)[:-8],2))
    if highlow=='low':
        return hex(int(bin(integer)[-8:],2))
4

3 に答える 3

15

これにより、上位バイトと下位バイトがタプルとして返されます。

def bytes(integer):
    return divmod(integer, 0x100)

例えば:

>>> high, low = bytes(0x607F)
>>> hex(high)
'0x60'
>>> hex(low)
'0x7f'

ところで、バイトが何のために必要か、そして整数がどこから来たかによっては、必要なことを行うためのはるかに良い方法があるかもしれません。

于 2013-02-23T03:03:49.817 に答える
6
def bytes(num):
    return hex(num >> 8), hex(num & 0xFF)

bytes(0x607F)

収量

('0x60', '0x7f')
于 2013-02-23T03:14:05.573 に答える
2

非常に正しいNedの答えに追加するには、構造体はバイトを抽出するための強力なツールです。

>>> import struct
>>> print("0x%2x 0x%2x\n" % tuple(struct.pack('<H',0x4355)))
0x55 0x43

この例では、"<" は入力をリトルエンディアンとして解釈するように pack に指示し、"H" は 2 バイトの数値を期待するように指示します。Struct は (Python 3 で) バイト オブジェクトを生成し、これをタプルに変換して、%x の文字列書式設定パラメーターを満たし、16 進数を出力できます。

Python 2.7 は少し面倒ですが、それは struct.pack が情報を文字列に入れ、それを文字に分割する必要があるからです:

>>> print("0x%2x 0x%2x\n" % tuple([ ord(x) for x in struct.pack('<H',0x4355)]))
0x55 0x43

この例のように単純なことを実際行っている場合、それはおそらくやり過ぎです。たとえば、マイクロコントローラーから監視されるレジスターから、より多くの値または異なる長さの数値を操作する場合、または C または C++ とデータを交換する場合は、構造体を使用して、バイトを簡単にラングリングできるようにすることを検討してください。

于 2016-04-20T00:06:42.100 に答える