С#: Преобразование строки в 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));