これはひどく間違っていると確信しており、いくつか問題があります。WIN32_FIND_DATAW
構造体の配列を次々にディスクに書き出しました。Pythonスクリプトでそれらを使用して解析したいと思います。
私が現在使用しているコードは次のとおりです。
>>> fp = open('findData', 'r').read()
>>> data = ctypes.cast(fp, ctypes.POINTER(wintypes.WIN32_FIND_DATAW))
>>> print str(data[0].cFileName)
最初の問題は、3行目が私が期待するような素敵な文字列を印刷しないことです。印刷する代わりに印刷$Recycle.Bin
しますUnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
これは、そこに保存されているデータを印刷した結果です。
>>> data[0].cFileName
u'\U00520024\U00630065\U00630079\U0065006c\U0042002e\U006e0069'
これは比較的合理的に見えます。 $
はASCII0x24、R
はASCII0x52などです。
では、なぜ文字列のように印刷できないのでしょうか。
私の2番目の質問はそれをすることです:
>>> data[1].cFileName
ばかげたデータをくれます。私はそれをctypes.cast
正しく使用していないとかなり確信しています。これらにアクセスするにはどうすればよいですか?明確にするために、CではPWIN32_FIND_DATAW
、バッファーの先頭へのポインターをポイントし、同様のコードを使用して配列内の個々の構造体にアクセスします。Pythonでも同じことをしようとしています。
アップデート
行うこと:
>>> data[0].cFileName.encode('windows-1252')
このエラーが発生します:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined>
アップデート
最初のエントリの先頭(data[0]
cFileNameの最初の部分まで)は次のようになります。
user@ubuntu:~/data$ hexdump -C findData | head -n 6
00000000 16 00 00 00 dc 5a 9f d2 31 04 ca 01 ba 81 89 1a |.....Z..1.......|
00000010 81 e2 cd 01 ba 81 89 1a 81 e2 cd 01 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 24 00 52 00 |............$.R.|
00000030 65 00 63 00 79 00 63 00 6c 00 65 00 2e 00 42 00 |e.c.y.c.l.e...B.|
00000040 69 00 6e 00 00 00 00 00 00 00 00 00 00 00 00 00 |i.n.............|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
必要に応じて、さらにデータを投稿できます。