Как получить \ 0 от моей строки из C ++ при чтении в C # - PullRequest
0 голосов
/ 06 декабря 2009

Я застрял здесь. Я разрабатываю специальный компонент Pipleline для Commerce Server 2009, но это не имеет ничего общего с моей проблемой.

В настройке канала я предоставляю пользователю форму окна для ввода некоторых значений конфигурации. Одним из этих значений является URL-адрес сайта SharePoint. Commerce Server использует компоненты C ++ за всем этим конвейерным материалом, поэтому введенные значения помещаются в IDictionary и в конечном итоге сохраняются в БД через компонент C ++ от Microsoft.

Когда я читаю строку во время выполнения конвейера, она передается мне в объекте IDictionary из C ++. Мой код C # видит этот URL с суффиксом \ 0 \ 0. Я не уверен, откуда они берутся, но мой код взрывается, потому что это недопустимый URI. Я обрезаю строку, прежде чем сохранить ее, и обрезаю, когда читаю, и все еще не могу избавиться от них.

Любые идеи, что вызывает это и как я могу избавиться от этого? Я предпочитаю не иметь хака, подобного его подстроке, а что-то, что становится основной причиной.

Спасибо, Corey

Ответы [ 4 ]

4 голосов
/ 06 декабря 2009

Поможет ли это:

string sFixedUrl = "hello\0\0".Trim('\0');
1 голос
/ 06 декабря 2009

Как объяснили посты других, строки в C заканчиваются нулем. (Обратите внимание, что C ++, однако, уже предоставляет строковый тип, который не зависит от этого.)

Ваш случай немного отличается, потому что вы получаете строку с двойным нулем в конце. Я здесь не эксперт, поэтому любой может смело поправлять меня, если я ошибаюсь. Но это похоже на типичное строковое представление для приложений, поддерживающих юникод / ​​i18n в Windows, которые используют широкие символы. Пожалуйста, посмотрите на этот .

Можно предположить, что приложение, сохраняющее строку в базе данных, не использует «переносимую» стратегию. Например, он может сохранять строковый буфер, учитывая его размер в необработанных байтах вместо его фактической длины . Первый будет считать дополнительные два нуля в конце (и, следовательно, сохранит их тоже), а второй отбросит их.

0 голосов
/ 06 декабря 2009

Другая техника, которую вы можете использовать, это массив символов и длина массива. Массив символов не нуждается в завершающем нулевом символе.

Когда вы передаете эту структуру данных, вы должны также передать длину. Соглашение для строк в стиле C заключается в определении конца строки путем поиска «\ 0» (или в Unicode «\ 0 \ 0»). Поскольку в массиве нет завершающих символов, длина всегда нужна.

Гораздо лучшим решением является использование std::string. Это не добавляет нулевые символы. Если вам нужна совместимость или формат в стиле C, используйте метод c_str(). Я должен использовать эту технику с моей программой, потому что у GUI есть собственный строковый тип данных, который несовместим с std::string

0 голосов
/ 06 декабря 2009

Из этого сайта:

Строка в C - это просто массив символов, конечный символ которого установлен на NUL (точка 0 ascii / unicode) Этот нулевой терминатор обязателен; строка плохо сформирована, если ее там нет. Строковый литерал в C / C ++ («строка») гарантирует это.

 const char *str = "foo";

совпадает с

 const char *str = {'f', 'o', 'o', 0};

Поэтому, как только компонент C ++ получит ваш IDictionary, он добавит строку с нулевым символом в конце. Если вы хотите удалить его, вам придется удалить символ с нулевым символом в конце с конца перед отправкой словаря обратно. См. этот пост о том, как удалить символ с нулевым символом в конце. В основном вам нужно знать точный размер и обрезать его.

...