Обзор
Я работаю над упаковкой функциональности Windows Shell с помощью Qt.Проблема, с которой я столкнулся в отношении ABSOLUTE_IDLIST
s и хранения данных.Для справки, список идентификаторов Windows в памяти выглядит следующим образом:
//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' =
=================================================================
Я использую абсолютный идентификатор в качестве уникального идентификатора для каждого узла для быстрого поиска.Тип значения - 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, что позволит быстрее выполнять сравнения, а не просто передавать список идентификаторов в виде необработанных данных конструктору QByteArray
.
ITEMIDLIST_ABSOLUTE *someIdListPointer = ...;
QByteArray ba(someIdListPointer);
Проблема
К сожалению, QByteArray принимает завершенный нулем const char *
, без указания подписи или неподписания.Поскольку я работаю в Windows, по умолчанию используется знаковый символ.
Вопрос
Можно ли привести значение к [signed] char *
и игнорировать проблемы переполнения, поскольку каждый ключ отрицательного значения будет переполнен в одном и том жепуть?В частности, будет ли красно-черное дерево по-прежнему работать в обычном режиме, поскольку результирующие данные гарантированно будут одинаковыми при двух отдельных вызовах с одним и тем же ключом?
Примечание. Я знаю, что USHORT cb
будет включенов ключе.Это приемлемо, так как это просто дополнительные данные, которые будут сопоставляться с двумя одинаковыми ключами.
Редактировать: уточнено, что abId
на самом деле является массивом без нулевого терминатора.