С#: Преобразование строки в Sbyte *
В моем коде С# используется управляемый С++ Wrapper. Чтобы создать новый объект этого типа Wrapper, мне нужно преобразовать String в Sbyte *. Несколько сообщений StackOverflow.com обсуждали, как преобразовать String в byte [], а также byte [] в sbyte [], но не String to sbyte *.
msdn.social.com предлагает советы о том, как преобразовать массив байтов в строку:
> // convert String to Sbyte*
> string str = "The quick brown, fox jumped over the gentleman.";
>
> System.Text.ASCIIEncoding encoding = new
> System.Text.ASCIIEncoding();
>
> Byte[] bytes = encoding.GetBytes(str);
Однако, "байты" не относятся к типу sbyte *. Мои следующие попытки конвертировать байты в sbyte * не удалось:
1. Convert.ToSbyte(bytes);
2. cast: (sbyte*) bytes;
Пожалуйста, сообщите мне, как преобразовать строку С# в sbyte *.
Также, пожалуйста, расскажите о каких-либо побочных эффектах от введения sbyte *, который, я считаю, является небезопасным кодом.
Спасибо,
Кевин
Ответы
Ответ 1
Хммм, как насчет чего-то вроде этого:
(не тестировал его, не дал мне -1, если он не работает, я просто считаю, что он должен):))
string str = "The quick brown fox jumped over the gentleman.";
byte[] bytes = Encoding.ASCII.GetBytes(str);
unsafe
{
fixed (byte* p = bytes)
{
sbyte* sp = (sbyte*)p;
//SP is now what you want
}
}
Ответ 2
sbyte [] и sbyte * почти то же самое (почти)
sbyte [] str1;
sbyte * str2;
& str1 [0] - указатель на первый элемент массива символов
str2 - это указатель на char, который, по-видимому, содержит последовательность последовательных символов, за которым следует нулевой ограничитель
если вы используете str1 в качестве массива, вы знаете длину без нулевого терминатора. но если вы хотите передать str1 в строку api, которая требует sbyte *, вы используете & str1 [0], чтобы превратить ее в sbyte *, а затем вы удалили информацию о длине массива, поэтому вам нужно сделать sur eyou're null завершено.
Ответ Cipi показывает вам, как преобразовать массив в указатель, С# затрудняет использование указателей. в C или С++ массивы и указатели похожи.
http://www.lysator.liu.se/c/c-faq/c-2.html
http://pw1.netcom.com/~tjensen/ptr/pointers.htm
Ответ 3
Вы можете сделать так:
sbyte[] sbytes = Array.ConvertAll(bytes, q => Convert.ToSByte(q));