#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
сильно отличается от Cchar*
, вы не можете просто применить к нему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 , который считывает строку из базы данных и копирует ее в двойной массив. Я ценю вашу помощь.