Подтвердить что ты не робот

Char * указатель из строки в С#

Можно ли получить a char* для переменной string в С#?

Мне нужно преобразовать строку пути в char* для использования некоторой собственной функции win32...

4b9b3361

Ответ 1

Вы можете передать StringBuilder как char*.

Посмотрите http://pinvoke.net, чтобы увидеть, нет ли сигнатуры для этой функции.

Ответ 2

Хорошо, вы могли бы это сделать:

string str = "my string";

unsafe 
{
    fixed (char* p = str)
    {               
        // do some work
    }
}

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

Ответ 3

Это зависит от того, что вы хотите сделать. Когда вы вызываете функцию Win32 через PInvoke, вы должны просто передать переменную String; каркасные маршалы все для вас. Если вам нужно что-то более сложное, посмотрите Marshal.StringToHGlobalAnsi и другие методы класса Marshal.

Ответ 4

Чтобы объединить 2 анвера, уже заданного, это зависит от того, какое направление вам необходимо для вашего параметра.

Если функции просто нужна строка ввода, то есть const char *, вы можете использовать аргумент типа System.String (или plain string).

Если функция заполняет строку, т.е. char * buffer, int bufferSize, вы можете передать System.Text.StringBuilder.

В обоих случаях (auto-) Marshaling выполнит необходимые преобразования для вас.

Ответ 5

Не требуется небезопасный контекст для следующего фрагмента кода (и да, он показывает, что внутренние болты и биты о реализации метода string GetHashCode показывают его разницу с одним в Java, потому что в С# значение hashcode isn 't кэшируется, и в целом это показывает, что строки С# не являются в конечном счете неизменными, как вы могли бы научить, не можете иметь дело с Фон Нейманом):

using System;
using System.Runtime.InteropServices;

namespace Guess
{
    class Program
    {
        static void Main(string[] args)
        {
            const string str = "ABC";

            Console.WriteLine(str);
            Console.WriteLine(str.GetHashCode());

            var handle = GCHandle.Alloc(str, GCHandleType.Pinned);

            try
            {
                Marshal.WriteInt16(handle.AddrOfPinnedObject(), 4, 'Z');

                Console.WriteLine(str);
                Console.WriteLine(str.GetHashCode());
            }
            finally
            {
                handle.Free();
            }
        }
    }
}

Ответ 6

Вы можете получить массив byte [] из строки, используя Encoding.ASCII.GetBytes. Вероятно, это конвертируется в char *, используя фиксированный оператор в С#. (Это связывает выделенную память, не позволяя gc ее перемещать, - тогда вы можете сделать указатель на нее).

Итак, мой ответ да, только если вам удастся преобразовать байт * в char *. (в C/С++ это не будет проблемой, но я не уверен в С#)

PS > Я отправлю код позже, если найду закладку в статье об этом. Я знаю, что у меня это где-то..