C #: преобразование строки в Sbyte * - PullRequest
12 голосов
/ 14 апреля 2011

Мой код на C # использует Managed C ++ Wrapper. Чтобы сделать новый объект этого типа Wrapper, мне нужно конвертировать String в Sbyte *. В нескольких сообщениях на StackOverflow.com обсуждалось, как преобразовать String в byte [], а также byte [] в sbyte [], но не в String в 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;

Пожалуйста, сообщите мне, как преобразовать строку C # в sbyte *.

Также, пожалуйста, расскажите о любых побочных эффектах от введения sbyte *, который я считаю небезопасным кодом.

Спасибо, Кевин

Ответы [ 3 ]

17 голосов
/ 14 апреля 2011

Хм, как насчет этого:

(не проверял, не дайте мне -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
    }               
}
4 голосов
/ 14 апреля 2011

Вы можете сделать это так:

sbyte[] sbytes = Array.ConvertAll(bytes, q => Convert.ToSByte(q));
3 голосов
/ 14 апреля 2011

sbyte [] и sbyte * - это почти одно и то же (почти)

sbyte [] str1;sbyte * str2;

& str1 [0] - указатель на первый элемент массива символов. str2 - указатель на символ, за которым следует группа последовательных символов, за которыми следует нулевой терминатор

если вы используете str1 в качестве массива, вы знаете длину без нулевого терминатора.но если вы хотите передать str1 в строку api, для которой требуется sbyte *, вы используете & str1 [0], чтобы превратить его в sbyte *, а затем вы удалили информацию о длине массива, так что вы должны сделать, чтобы все было завершено.

Ответ Cipi показывает, как преобразовать массив в указатель, C # затрудняет использование указателей, специально.в C или C ++ массивы и указатели похожи.

http://www.lysator.liu.se/c/c-faq/c-2.html
http://pw1.netcom.com/~tjensen/ptr/pointers.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...