将未签名的字符转换为红黑色树的签名字符
Casting unsigned char to signed char for a red-black tree
概述
我正在努力用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 = ' ' =
=================================================================
我使用绝对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
实际上是一个没有空终止符的数组。
我可以投射到 [signed] char * 并忽略溢出问题吗,因为每个负值键都会以相同的方式溢出?具体来说,红黑树是否仍能正常工作,因为结果数据保证在具有相同键的两个单独调用中是统一的?
是的,像这样的强制转换只是以不同的方式解释内存中的字节,并且对于相同的机器 + 可执行文件/编译器是一致的。有符号整数的字节表示不是标准规定的,因此"含义"(即表示的数字(可能不是您所期望的,但对于只需要总排序的 RB 树来说,这无关紧要。
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 将未签名的字符转换为红黑色树的签名字符