Как получить \0 от моей строки из C++ при чтении в C#
Я вроде застрял здесь. Я разрабатываю собственный компонент Pipleline для Commerce Server 2009, но это не имеет ничего общего с моей проблемой.
В настройке канала я предоставляю пользователю форму окна для ввода некоторых значений для конфигурации. Одним из этих значений является URL-адрес сайта SharePoint. Commerce Server использует компоненты C++ за всем этим конвейерным материалом, поэтому введенные значения помещаются в IDictionary и в конечном итоге сохраняются в БД через компонент C++ от Microsoft.
Когда я читаю строку во время выполнения конвейера, она передается мне в объекте IDictionary из C++. Мой код C# видит этот URL с суффиксом \0\0. Я не уверен, откуда они берутся, но мой код взрывается, потому что это недопустимый URI. Я обрезаю строку, прежде чем сохранить ее, и обрезаю, когда читаю, и все еще не могу избавиться от них.
Любые идеи, что вызывает это и как я могу избавиться от этого? Я предпочитаю не иметь хак, подобный его подстроке, а что-то, что становится основной причиной.
Спасибо Кори
4 ответа
Как объяснили посты других, строки в C заканчиваются нулем. (Обратите внимание, что C++, однако, уже предоставляет строковый тип, который не зависит от этого.)
Ваш случай немного отличается, потому что вы получаете строку с двойным нулем в конце. Я здесь не эксперт, поэтому любой может смело поправлять меня, если я ошибаюсь. Но это похоже на типичное строковое представление для приложений, поддерживающих юникод / i18n в Windows, которые используют широкие символы. Пожалуйста, посмотрите на это.
Можно предположить, что приложение, которое сохраняет строку в базе данных, не использует "переносимую" стратегию. Например, он может сохранять строковый буфер, учитывая его размер в необработанных байтах, а не его фактическую длину. Первый будет считать дополнительные два нуля в конце (и, следовательно, сохранит их тоже), а второй отбросит их.
С этого сайта:
Строка в C - это просто массив символов, конечный символ которого установлен в NUL-символ (точка 0 ascii / unicode). Этот нулевой терминатор обязателен; строка плохо сформирована, если ее там нет. Строковый литерал в C/C++ ("строка") гарантирует это.
const char *str = "foo";
такой же как
const char *str = {'f', 'o', 'o', 0};
Поэтому, как только компонент C++ получит ваш IDictionary, он добавит строку с нулевым символом в конце. Если вы хотите удалить его, вам придется удалить символ с нулевым символом в конце с конца перед отправкой словаря обратно. Смотрите этот пост о том, как удалить символ с нулевым символом в конце. В основном вам нужно знать точный размер и обрезать его.
Другая техника, которую вы можете использовать, это массив символов и длина массива. Массив символов не нуждается в завершающем нулевом символе.
Когда вы передаете эту структуру данных, вы должны также передать длину. Соглашение для строк в стиле C заключается в определении конца строки путем поиска "\0" (или в Unicode "\0\0"). Поскольку в массиве нет завершающих символов, длина всегда нужна.
Гораздо лучшим решением является использование std::string
, Это не добавляет нулевые символы. Если вам нужна совместимость или формат в стиле C, используйте c_str()
метод. Я должен использовать эту технику с моей программой, потому что у структуры GUI есть свой собственный тип данных строки, который несовместим с std::string
,