MS VC++ Преобразовать массив байтов в BSTR?

У меня есть строка, которая начинается в приложении .Net, зашифрована и хранится в AD. Затем он подхватывается собственным приложением C++ и расшифровывается для создания массива байтов, например, "ABCDEF" становится 00,41,00,42,00,43,00,44,00,45 после того, как он был расшифрован в конце C++. .

Мне нужно взять этот массив байтов и преобразовать его в BSTR «ABCDEF», чтобы я мог использовать его в другом месте, и я не могу найти способ выполнить этот последний шаг.

Кто-нибудь может помочь?


person user177656    schedule 23.09.2009    source источник


Ответы (2)


Если у вас действительно есть массив произвольных байтов, используйте SysAllocStringByteLen. Но похоже, что, несмотря на массив байтов, ваши данные на самом деле представляют собой строку Unicode в кодировке UTF-16, поэтому в этом случае вам, вероятно, лучше использовать SysAllocStringLen вместо этого. Передайте указатель на массив байтов функции (приведите тип к OLECHAR*), и символы будут скопированы в новую строку вместе с дополнительным нулевым символом в конце.

person Rob Kennedy    schedule 23.09.2009
comment
Спасибо за ваши ответы. Я уже был на этом пути, и то, что заканчивается в BSTR, не является допустимой строкой Unicode. Когда я печатаю BSTR на консоль, я получаю кучу ?s (как ни странно, за исключением символа пробела, который выходит правильно), правильное количество ?s, но не правильные символы. Предполагая, что я испортил вывод консоли, я проверил BSTR на соответствие тому, что там должно быть, и тесты провалились. Я использую BSTR newStr = SysAllocStringLen((OLECHAR *)decryptedBytes, dataLength/2); для создания строки. Массив decryptedBytes действительно содержит допустимый поток байтов 00,41... и т. д. - person user177656; 23.09.2009
comment
Это может быть проблема с порядком байтов - байты в каждом символе Unicode меняются местами, и вам нужно поменять их местами. - person sharptooth; 23.09.2009
comment
Дох! Спасибо, это проблема. Сейчас работает нормально :-) - person user177656; 23.09.2009

«Расшифрованная строка» — это просто строка Юникода — латинские символы содержат первый байт, равный нулю при представлении в Юникоде. Таким образом, вам не нужно никакого реального преобразования, просто приготовьте BSTR из этого буфера.

Зная количество символов Unicode — оно будет равно половине длины буфера — вызовите SysAllocStringLen(), чтобы выделить достаточно длинный неинициализированный BSTR с завершающим нулем. Затем скопируйте свой массив в выделенную строку с помощью memcpy(). В качестве альтернативы вы можете вызвать SysAllocStringLen() и передать ему буфер байтов, чтобы он сделал копию для вас и пропустил memcpy(). Не забудьте позвонить SysFreeString(), когда вам больше не нужен BSTR.

person sharptooth    schedule 23.09.2009
comment
Зачем создавать неинициализированные строки, а потом копировать символы? SysAllocStringLen скопирует символы для вас, если вы позволите. - person Rob Kennedy; 23.09.2009
comment
Я думаю, предполагается, что персонажи находятся в каком-то хранилище, которое можно транслировать; в этом случае мы можем избежать выделения исходного буфера, передав их прямо в BSTR. На практике это, скорее всего, не имеет значения в данном конкретном случае. - person Pavel Minaev; 23.09.2009
comment
@Rob Kennedy: Да, вполне разумная поправка. - person sharptooth; 23.09.2009