1

私はこのコードを持っています:

/server/frontend/wsn.py
Line 866:        
    netid = hextransform(int(nid), 16)

Line 156: 
    def hextransform(data, length):
        data = hex(data)[2:]
        assert(len(data) <= length)
        # zero-padding
        data = ('0' * (length - len(data))) + data
        # Swap 'bytes' in the network ID
        data = list(data)
        for i in range(0, length, 2):
            tmp = data[i]
            data[i] = data[i + 1]
            data[i + 1] = tmp
        # Reverse the whole string (TODO: CHECK) 
        data.reverse()
        #data = "".join(data)
        return data

私の問題は、nid = 15579202759033880576例えば私が持っているときです。長すぎますか?

Tornado から受け取ったエラーは次のとおりです。

Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 988, in _execute
    getattr(self, self.request.method.lower())(*args, **kwargs)
  File "/usr/lib/python2.6/site-packages/tornado/web.py", line 1739, in wrapper
    return method(self, *args, **kwargs)
  File "./wsn.py", line 866, in get
    netid = hextransform(int(nid), 16)
  File "./wsn.py", line 158, in hextransform
    assert(len(data) <= length)
AssertionError

しかしnetid、16 進数では 0xd834725e00000000len(nid) = 16です。

何が問題なのかわからない。

4

2 に答える 2

2

PythonはL長い数のためにを追加します:

>>> hex(int(15579202759033880576))
'0xd834725e00000000L'

もう1文字追加します。別の方法を使用して、16進数を作成します。

format(data, '016x')

代わりは。このformat()関数を使用すると、フォーマット仕様のミニ言語を使用してデータを変換できます。xこの場合、は小文字の16進表現であり、何もスライスする必要はありません。

>>> format(15579202759033880576, '016x')
'd834725e00000000'

そこにある形式の016に注意してください。数値が16進数の16桁よりも小さい場合は、ゼロが埋め込まれます。

>>> format(1557920, '016x')
'000000000017c5a0'

バイトスワッピングもより簡単に行うことができます。Pythonは複数の割り当てをサポートしており、一時変数を必要とせずに2つの値を交換できます。

for i in range(0, length, 2):
    data[i], data[i + 1] = data[i + 1], data[i]

したがって、hextransformメソッドは次のように簡略化できます。

def hextransform(data, length):
    data = format(data, '0{0}x'.format(length))
    assert(len(data) == length), '{0!r}, {1}'.format(data, length)
    # Swap 'bytes' in the network ID
    data = list(data)
    for i in range(0, length, 2):
        data[i], data[i + 1] = data[i + 1], data[i]
    data.reverse()
    return data

その結果:

>>> hextransform(15579202759033880576, 16)
['0', '0', '0', '0', '0', '0', '0', '0', '5', 'e', '7', '2', '3', '4', 'd', '8']
于 2013-01-25T16:08:28.290 に答える
1

の「L」hex(int(num))が問題です:

>>> hex(int(15579202759033880576))[2:]
'd834725e00000000L'   <-- 17 with the L

これに対する最も簡単な修正は、部分文字列チョップを更新して、その L も削除することです。

data = hex(data)[2:].split('L')[0]

これにより、文字列が L (存在する場合) で分割され、16 進数の部分が得られます。「L」は 16 進文字ではないので安全です。したがって、長い文字列がある場合にのみ表示されます。

于 2013-01-25T16:17:12.230 に答える