Какой тип символов использовать в следующем сценарии? - PullRequest
0 голосов
/ 27 сентября 2019

Я разрабатываю 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
  }
}
...