Есть ли в C # способ преобразования двойного массива в строку, аналогичный приведению C к символу *?

#c# #c

#c# #c

Вопрос:

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

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

Код C , который преобразует двойной массив Darray в символ *:

     char*s = (char*)Darray
  

Я пробовал несколько вещей в C #, которые не создавали желаемую строку, включая (очевидная ошибка компиляции):

 string s = (string) Darray;
  

Код C #, который не создал строку, идентичную коду 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);
  

Код C #, который также не создал строку, идентичную коду C :

 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();
}
  

Код C #, который также не создал строку, идентичную коду C :

 byte[] theBytesData = new byte[numBytesReqd];
Buffer.BlockCopy(Darray, 0, theBytesData, 0, numBytesReqd);
string theString = Encoding.ASCII.GetString(theBytesData, 0, theBytesData.Length);
  

Возможно, нет другого решения этой проблемы, кроме программы на смешанном языке.

Для следующего кода на C :

     double Darray[] = { 1.0,2.0,3.0 };
    char* DarrayCp = (char*)Darray;
    for (int i = 0; i < blockSize; i  )
    {
        cout << i << "tDarrayCp: " << DarrayCp[i] << endl;
    }
  

Я получаю следующий вывод, который я хотел бы воспроизвести с помощью кода C #:

 0   DarrayCp:  
1   DarrayCp:  
2   DarrayCp:  
3   DarrayCp:  
4   DarrayCp:  
5   DarrayCp:  
6   DarrayCp: ð
7   DarrayCp: ?
8   DarrayCp:  
9   DarrayCp:  
10  DarrayCp:  
11  DarrayCp:  
12  DarrayCp:  
13  DarrayCp:  
14  DarrayCp:  
15  DarrayCp: @
16  DarrayCp:  
17  DarrayCp:  
18  DarrayCp:  
19  DarrayCp:  
20  DarrayCp:  
21  DarrayCp:  
22  DarrayCp: 
23  DarrayCp: @
  

Комментарии:

1. C # string сильно отличается от C char* , вы не можете просто применить к нему

2. Вы неправильно понимаете, что происходит в C , когда вы приводите массив к char* . Вы не создаете строку, вы просто обрабатываете ее как последовательность байтов. Мне все еще очень неясно, что вы пытаетесь сделать, поэтому я не могу предложить больше указаний.

3. Да, я не понимаю, что происходит в C , когда я преобразую массив в символ *. Это было то, что подрядчик сделал много лет назад. Я пытаюсь заменить код C кодом C #, который выдаст ту же строку. У меня есть код на C , который я хочу сохранить, чтобы обрабатывать его в обратном направлении (символ * в двойной массив), поэтому строка должна быть одинаковой, независимо от того, создана ли она кодом C # или C . Спасибо, что посмотрели на это. Извините, я недостаточно ясно выразился.

4. @BobC. Вы описываете, что вы хотели сделать на высоком уровне, так почему вы тратите время на просмотр кода C для этого, когда вы пытаетесь сделать это на C #?

5. Мне нужно создать из C # ту же строку, что и в коде C , потому что у меня есть большой объем вычислительного кода на C , который извлекает двойные значения в виде строки из поля памятки базы данных. У меня есть большое количество программного обеспечения на C (графический интерфейс, база данных), которое в настоящее время использует приведение к символу *, которое я хочу заменить программным обеспечением C #. Я использовал программное обеспечение C только для демонстрации строки, которую мне нужно создать.

Ответ №1:

Поскольку вы просто переосмысливаете необработанные байты в коде C , выходные символы, которые вы видите, зависят от кодировки, используемой консолью или любым другим методом вывода, который вы используете для тестирования кода C .

Похоже, что ISO-8859-1 выдает тот же результат, что и образец, который вы опубликовали:

 var Darray = new double[] { 1.0, 2.0, 3.0 };
var bytes = new byte[Darray.Length * sizeof(double)];
Buffer.BlockCopy(Darray, 0, bytes, 0, bytes.Length);
var str = Encoding.GetEncoding("ISO-8859-1").GetString(bytes);
  

но мне неясно, действительно ли это преобразование полезно для того, чего вы пытаетесь достичь, поскольку string и char в C # используются символы UTF-16, поэтому результирующее str представление имеет совершенно другое байтовое представление. bytes уже представляет те же данные, что и DarrayCp в вашем исходном коде C , без какого-либо преобразования.

Комментарии:

1. Спасибо за информацию. Похоже, что другое байтовое представление не позволяет преобразовать обратно в код C , который считывает строку из базы данных и копирует ее в двойной массив. Я ценю вашу помощь.