我确定这是非常错误的,而且我遇到了一些问题。我已经将一系列WIN32_FIND_DATAW
结构一个接一个地写入磁盘,我想在我的 Python 脚本中使用和解析它们。
我目前使用的代码是:
>>> fp = open('findData', 'r').read()
>>> data = ctypes.cast(fp, ctypes.POINTER(wintypes.WIN32_FIND_DATAW))
>>> print str(data[0].cFileName)
第一个问题是第三行没有像我期望的那样打印一个漂亮的字符串。而不是打印$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'
这看起来比较合理。 $
是 ASCII 0x24,R
是 ASCII 0x52 等等。
那么为什么我不能像字符串一样打印呢?
我的第二个问题是这样做:
>>> 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 |................|
如果需要,我可以发布更多数据。