Я разрабатываю SNMP agent
для Windows SNMP service
.Существует два процесса: один процесс находится в C#
, который считывает значения контролируемых переменных и создает строку, а при межпроцессном взаимодействии эта строка отправляется в SNMP agent
, который является процессом C++
.
Символы 16bit
в C#
и для их чтения я использую тип данных wchar_t
в конце C++
.Теперь, чтобы выставить значения string
для Windows SNMP service
, snmp.h
от Microsoft использует struct
, определение которого следующее:
typedef struct {
BYTE * stream;
UINT length;
BOOL dynamic;
} AsnOctetString;
Здесь length
будет длиной строки иstream
будет потоком BYTE
, который фактически представляет значение строки.Проблема в том, что BYTE
- это unsigned char
, а все прочитанные данные - wchar_t
.unsigned char
- это 8 бит, а wchar_t
- 16 бит.BYTE
не может содержать wchar_t
.Должен ли я удвоить пространство, выделенное для BYTE* stream
?Должен ли я вообще переключиться на другой тип char
?Если я переключусь на что-то вроде char
, то думаю, что не смогу прочитать 16-битный символ из C#
.Как действовать по такому сценарию?Я новичок в этом низкоуровневом программировании.
EDIT : код функции, в которой я разрешаю значения
void ResolveAsnValue(const std::wstring& asnValue, const std::wstring& asnType, AsnAny* asnAny)
{
asnAny->asnType = AsnDataTypeMap.at(asnType);
switch (AsnDataTypeMap.at(asnType)) {
case ASN_OCTETSTRING:
asnAny->asnValue.string.length = asnValue.length();
asnAny->asnValue.string.stream = (BYTE*)SnmpUtilMemAlloc(asnAny->asnValue.string.length * sizeof(wchar_t));
memcpy(asnAny->asnValue.string.stream, &asnValue, asnAny->asnValue.string.length);
break;
//other cases
}
}