代码之家  ›  专栏  ›  技术社区  ›  jonspaceharper

将红黑树的无符号字符转换为有符号字符

  •  2
  • jonspaceharper  · 技术社区  · 6 年前

    概述

    我正在用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 实际上是一个没有空终止符的数组。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Max Langhof    6 年前

    我可以强制转换为[signed]char*并忽略溢出问题,因为每个负值键都会以相同的方式溢出吗?具体来说,红黑树是否仍能正常工作,因为生成的数据保证在两个具有相同密钥的单独调用中是一致的?

    是的,这样的转换只是以不同的方式解释内存中的字节,对于相同的机器+可执行文件/编译器来说是一致的。有符号整数的字节表示不是标准强制要求的,因此“含义”(即表示的数字)可能不是您所期望的,但是对于只需要总排序的rb树来说,这不应该有什么关系。