0

python ctypesキャストはnull文字列を取得します

b住所です

が一般的な文字の場合b_v.value、これは正常です。しかし、bの内容が "1122001314" のような 16 進数の場合、16 進数の "00" が含まれている限り、結果は 1122 になり、001314 は失われるはずです

今、すべてのコンテンツ「1122001314」を取得したい。方法を教えてください よろしくお願いします。

コードは次のとおりです。

b_v=ctypes.cast(b,ctypes.POINTER(ctypes.c_char_p))

print binascii.b2a_hex(b_v.value)

例:

import ctypes
import binascii

va=binascii.a2b_hex('1212273031003535')
tt=ctypes.create_string_buffer(va)
b=ctypes.addressof(tt)
b_v=ctypes.cast(b,ctypes.c_char_p)
print binascii.b2a_hex(b_v.value)

結果は次のとおりです。"1212273031"

結果が欲しい"1212273031003535"

4

1 に答える 1

2

この行tt=ctypes.create_string_buffer(va)では、データ(バイナリデータ)の16進表現からstring_bufferを構築していますが、c文字列は最初の0値の文字で終了するため、これは誤りです。したがって、データが壊れます。幸い、ctypesは文字列値に加えてrawデータを提供するためtt.raw、元のデータにアクセスして使用することができますがbinascii.b2a_hex(tt.raw)、それが役立つかどうかはわかりません。

実行b=ctypes.addressof(tt)してアドレスを別の場所に渡し、アドレスからデータを取得するb_v=ctypes.cast(b,ctypes.c_char_p)場合は、データがテキストではないため、string_bufferタイプでは不可能です。これはバイナリデータであり、string_bufferに格納することはできません。次に、そのアドレスを使用してアクセスします。

データの長さもわかっている場合は、bを知っていればデータを取得できます。これを試してください。

b, l = ctypes.addressof(tt), len(tt) - 1 # l - 1, because there is one extra byte for terminator NULL

#Somewhere else:
b_v=ctypes.cast(b, ctypes.POINTER(ctypes.c_char * l))
print binascii.b2a_hex(b_v.contents)
于 2012-08-23T07:25:46.297 に答える