2

コロンで区切られた16進数の文字列をc_ubyteのctypes配列に変換するにはどうすればよいですか?ctypesのドキュメントによると、次のようにハードコードされたコレクションをキャストできます。

>>> from ctypes import *
>>> x = (c_ubyte * 6) (1, 2, 3, 4, 5, 6)
>>> x
<__main__.c_ubyte_Array_6 object at 0x480c5348>

または、そのように:

>>> XObj = c_ubyte * 6
>>> x = XObj(1, 2, 3, 4, 5, 6)
>>> x
<__main__.c_ubyte_Array_6 object at 0x480c53a0>

ただし、文字列の分割から生成されたもののように、変数リストをキャストする方法がわかりません。たとえば、次のようになります。

>>> mac = 'aa:bb:cc:dd:ee:ff'
>>> j = tuple(int(z,16) for z in mac.split(':'))
>>> j
(170, 187, 204, 221, 238, 255)
>>> x = (c_ubyte * 6) (j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required
>>> XObj = c_ubyte * 6
>>> x = XObj(j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required

私は何が欠けていますか?

ありがとう!

4

1 に答える 1

4

問題は、提供した最初の例では、XObj呼び出しに6つの引数を指定してctypesを正しく使用し、2番目の例(MACアドレスを使用)では、同じオブジェクトを呼び出してc_ubyte * 6タプルを指定しようとしていることですが、 6つの値ではないため、*args表記を使用して変換します。

from c_types import c_ubyte

mac = 'aa:bb:cc:dd:ee:ff'
j = tuple(int(z,16) for z in mac.split(':'))

converted = (c_ubyte * 6)(*j)  # *j here is the most signigicant part
print converted

そして結果は次のとおりです。

<__main__.c_ubyte_Array_6 object at 0x018BD300>

予想通り。

于 2012-08-17T21:58:52.973 に答える