Member 14077625 Ответов: 1

Есть ли в C# способ приведения двойного массива к строке, похожей на C++ cast.to чар*?


Я унаследовал код C++, который приводит двойной массив к символу char*, как показано ниже. В C# мне не удалось сгенерировать строку из массива двойников, которая соответствует строке, сгенерированной приведением C++. В C# можно ли каким-то образом сгенерировать строку из двойного массива, которая соответствовала бы строке, созданной в C++, где выполняется простое приведение к char*? Результатом приведения, по-видимому, являются какие-то двоичные данные.

Код на языке C++ :
char* s = (char*) Darray

где Даррей-это массив двойников

Что я уже пробовал:

В C# я, очевидно, не могу сделать следующее:

string theString = (string) Darray


В C# я безуспешно пытался сделать следующее:

int length = Darray.Length * sizeof(double);
IntPtr pnt = Marshal.AllocHGlobal(length );
Marshal.Copy(Darray, 0, pnt, Darray.Length);
byte[] Barray = new byte[length];
Marshal.Copy(pnt, Barray, 0, length);
string theString = BitConverter.ToString(Barray);


Я тоже безуспешно пытался это сделать:
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream m = new MemoryStream())
{
    formatter.Serialize(m, Darray);
    m.Position = 0;
    StreamReader sr = new StreamReader(m);
    string theString = sr.ReadToEnd();
}

Я тоже безуспешно пытался это сделать:
byte[] theBytesData = new byte[numBytesReqd];
Buffer.BlockCopy(Darray, 0, theBytesData, 0, numBytesReqd);
string theString = Encoding.ASCII.GetString(theBytesData, 0, theBytesData.Length);


Может быть, нет никакого решения этой проблемы. Я был бы признателен за любые мысли.

1 Ответов

Рейтинг:
2

Christian Graus

В C# у вас есть метод ToString для каждого объекта, который обычно должен выполнять интеллектуальную работу по созданию строки. У вас также есть методы Convert.ToXXX для принудительного приведения, и приведение также работает.

Но похоже, что вы пытаетесь использовать C#, как если бы это был C++. Это выглядит так же, но на самом деле это не так. Если вы используете указатели, скорее всего, вы используете C# неправильно.

Если бы у меня был двойной массив для преобразования в строку, я бы предположил, что использую stringbuilder и foreach для итерации по двойникам и добавления их по одному за раз. Нет никакого способа сделать это на уровне массива. Даже в C++ вы получите ASCII-версии чисел, а не сами числа. В C#, если это то, что вы хотите, вы бы сделали

Convert.ToChar(xxx); 


для каждого двойника, по одному за раз, в вашем массиве. Конечно, дубль выходит за пределы 255, так что я все еще не понимаю, что вы пытаетесь сделать.


Member 14077625

Я пытаюсь заменить код C++ кодом C# при создании строки для записи в поле memo в базе данных. Я пытаюсь сохранить код C++, который считывает строку из базы данных и преобразует ее в двойной массив. Код C++, который читает строку, имеет много вычислительного кода, прикрепленного к нему, и я не хочу преобразовывать его в C#.

Christian Graus

Так вы храните значения ascii? Вы хотите 65 за а?

Member 14077625

Я так не думаю, потому что когда я смотрю на строку, которую код C++ генерирует через приведение char*, это тарабарщина, как будто это какой-то двоичный файл.

Christian Graus

Хорошо, тогда нам нужно будет выяснить, что такое двоичный массив на самом деле, да?

Member 14077625

Да, хотя я не знаю, как это сделать. Наверное, я наивно полагал, что существует простой способ реплицировать приведение C++ в C#.

Christian Graus

Ну, согласно вашему коду C++, это строка ascii-чисел, или приведение к char* не будет работать? Таким образом, вы можете конвертировать по одному символу в ASCII с помощью кода, который я вам дал. Если это не массив значений ASCII, я не понимаю, как работает приведение

Member 14077625

Хорошо, спасибо за Ваш вклад, я воспользуюсь вашим кодом и попробую его использовать.

Christian Graus

Не беспокойтесь, просто прокомментируйте здесь еще раз, если вы все еще застряли, и я постараюсь помочь

Я скажу, что я перешел с C++ на C#, и мой код C# в течение первого года был ужасен, потому что я продолжал пытаться заставить его действовать как C++. Это больше похоже на Яву.