0

2 つの異なる 16 進文字列を介して 65535 より大きい値を送信する必要があります。これにより、文字列を受信したときにそれらを連結して整数を再び形成できます。たとえば、値が 70000 の場合、2 つの文字列は 0x0001 と 0x1170 になります。

整数を 16 進数に変換し、右に 4 シフトして一番上の文字列を取得し、最後の 4 文字以外をすべて削除して一番下の文字列を削除するのと同じくらい簡単だと思いました。

私はいくつかの構文(Pythonにとってかなり新しい)とおそらくいくつかのロジックに苦労しているかもしれないと思います. 誰でもこれを行う簡単な方法を考えることができますか?

ありがとう

4

5 に答える 5

3

divmod組み込み関数を使用:

>>> [hex(x) for x in divmod(70000, 65536)]
['0x1', '0x1170']
于 2012-06-20T17:02:12.540 に答える
1

こんな感じですか?

In [1]: big = 12345678
In [2]: first, second = hex(big)[2:][:-4], hex(big)[2:][-4:]
In [3]: first, second
Out[3]: ('bc', '614e')

In [4]: int(first+second, 16)
Out[4]: 12345678
于 2012-06-20T16:59:06.520 に答える
1

Lev Levitsky の回答のように、アルゴリズムは簡単に実装できます。

hex(big)[2:-4], hex(big)[-4:]

ただし、65536 未満の数値では失敗します。

それを修正することもできますが、16 進数の文字列を分割するのではなく、数値を分割してから、2 つの半分を 16 進数に変換する方がよいでしょう。

ecatmur の答えは、おそらくこれを行う最も簡単な方法です。

[hex(x) for x in divmod(70000, 65536)]

または、次のような数値で「右シフト/切り捨て」アルゴリズムを変換できます。

hex(x >> 16), hex(x & 0xFFFF)

これらを '0x6' ではなく '0x0006' のような文字列にする必要がある場合は、パーツで 16 進数を呼び出す代わりに、次のようにします。

['%#06x' % (x,) for x in divmod(x, 65536)]

または、より現代的な文字列フォーマット スタイルを使用します。

['0x{:04x}'.format(x) for x in divmod(x, 65536)]

しかし一方で、文字列を連結するのではなく、最初に int に変換してから数値をシフトしてマスクすることで、これを元に戻したいと思うかもしれません。ecatmur の答えの逆は次のとおりです。

int(bighalf) * 65536 + int(smallhalf)

シフト/マスク実装の (同等の) 逆は次のとおりです。

(int(bighalf) << 16) | int(smallhalf)

その場合、左側に余分な 0 は必要ありません。

また、数値が負の値または 4294967295 を超える可能性がある場合、これらのアルゴリズムはどれも機能しないことを指摘する価値がありますが、これらの場合に問題が発生しないためです。

于 2012-06-20T17:13:07.083 に答える
0

よりも大きい数値65536または長さが の数値の場合>=5、次を使用できますslicing

>>> num=70000
>>> var1=hex(num)[:-4]
>>> var2='0x'+hex(num)[-4:]
>>> integ=int(var1+var2[2:],16)
>>> print(integ)
    70000
于 2012-06-20T16:58:34.023 に答える
0

ビッグ/リトル エンディアンに注意して、シンプルに保つためにできることは次のとおりです。

val = 70000
to_send = '{:08X}'.format(val) # '00011170'
decoded = int('00011170', 16) # 70000

編集:非常に明確にするために...

hex1, hex2 = to_send[:4], to_send[4:] # send these two and on receipt
my_number = int(hex1 + hex2, 16)
于 2012-06-20T17:21:13.693 に答える