概述
我正在用qt包装windows shell功能。我遇到的问题
ABSOLUTE_IDLIST
存储数据。作为参考,a
Windows ID列表在内存中如下所示:
//Note that there may be an arbitrary number of cb/abId pairs.
=================================================================
= = (cb bytes) = = (cb bytes) = =
= USHORT cb = UCHAR []abID = USHORT cb = UCHAR []abId = '\0' =
=================================================================
我使用绝对id作为每个节点的唯一标识符
检索。值类型为
ShellNodePointer
,指向
ShellNode
,用于缓存数据。我最初是用
QHash
(基本上
std::unordored_map
,但这需要对每次检索的位进行散列(尽管我将散列键存储在shellnode中)。
//unsigned int is the hash result, ShellNodePointer is a QSharedPointer to a ShellNode
QHash<unsigned int, ShellNodePointer>
相反,我正在考虑使用红黑树方法
QMap
. 我的问题是
这:比较两个键的最快方法是将它们存储为
QByteArray
这将允许快速进行小于比较,并将id列表作为原始数据简单地传递给
QBYTAR射线
构造函数。
ITEMIDLIST_ABSOLUTE *someIdListPointer = ...;
QByteArray ba(someIdListPointer);
问题
不幸的是,qbytearray以空结尾
const char *
,没有
指定已签名或未签名。因为我在windows上,这个默认值是签名的
烧焦。
问题
我能投球吗
[signed] char *
忽略溢出问题,因为每个负值键都会以相同的方式溢出?具体来说,红黑树是否仍能正常工作,因为生成的数据保证在两个具有相同密钥的单独调用中是一致的?
注:我知道
USHORT cb
将包含在密钥中。这是可以接受的,因为这只是额外的数据,将与两个相同的键匹配。
编辑:澄清
abId
实际上是一个没有空终止符的数组。