我正在尝试使用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
s,这样可以快速进行比较,并将id列表作为原始数据简单地传递给QByteArray
构造函数。
ITEMIDLIST_ABSOLUTE *someIdListPointer = ...;
QByteArray ba(someIdListPointer);
不幸的是,QByteArray采用空终止const char *
,没有
具体签名或未签名。由于我在Windows上,因此默认为签名
炭。
我可以转换为[signed] char *
并忽略溢出问题,因为每个负值键都会以相同的方式溢出吗?具体来说,红黑树是否仍然可以正常工作,因为在使用相同密钥的两个单独调用中保证结果数据是统一的?
注意:我知道密钥中会包含USHORT cb
。这是可以接受的,因为它只是与两个相同的键匹配的额外数据。
编辑:澄清abId
实际上是一个没有空终止符的数组。
答案 0 :(得分:2)
我可以转换为[signed] char *并忽略溢出问题,因为每个负值键都会以相同的方式溢出吗?具体来说,红黑树是否仍然可以正常工作,因为在使用相同密钥的两个单独调用中保证结果数据是统一的?
是的,像这样的转换只是以不同的方式解释内存中的字节,并且对于相同的机器+可执行文件/编译器将是一致的。有符号整数的字节表示不是标准规定的,因此“含义”(即表示的数字)可能不是您所期望的,但这对于只需要总排序的RB树来说无关紧要。