Member 14077625 Ответов: 3

Как преобразовать двойной массив в строку, соответствующую тому же преобразованию, используя memcpy в C++


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

Код C++, преобразующий двойной массив в строку:

int numValues = 3;
double stations[] = { 1.0,2.0,3.0 };
int blockSize = numValues * sizeof(double);
char* mp_memoValue = new char[blockSize + 1];
memcpy(mp_memoValue, (char*)stations, blockSize);


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

byte[] theBytesData = new byte[numBytesReqd];
Buffer.BlockCopy(stations, 0, theBytesData, 0, numBytesReqd);
theMemoField = Encoding.ASCII.GetString(theBytesData, 0, theBytesData.Length);


Кроме того, следуя предложенному решению № 1, я сделал следующее, хотя оно не произвело ту же двоичную строку, что и код C++.

Идея использования двоичной копии кажется правильной. Может быть, основной вопрос заключается в том, что делают станции (char*)в C++ и можно ли дублировать это поведение в C#, а затем делать двоичную копию? Возможно, я прошу невозможного, мои знания ограничены.

BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream m = new MemoryStream())
{
    formatter.Serialize(m, stations);
    m.Position = 0;
    StreamReader sr = new StreamReader(m);
    theMemoField = sr.ReadToEnd();
}

3 Ответов

Рейтинг:
2

Member 14077625

Я попробовал использовать BitConverter следующим образом:
byte[] theBytesData = BitConverter.GetBytes(станции[0]);
theMemoField = BitConverter.Метод toString(theBytesData);

Но он не производил ту же строку, что и код C++.

Рейтинг:
0

#realJSOP

Вы не показали нам, как выглядит строка, созданная кодом C++.

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

Далее я буду считать, что вы извлекли строку из базы данных.

Учитывая эти два предположения...

Чтобы поместить массив двойников в строку с разделителями:


// convert an array of doubles to a deliimited string
string myData = string.Empty;
double[] doubles = new double[]{1.2,3.4,5.6 };
foreach(double dbl in doubles)
{
    // we only need a comma if the string is not empty
    string comma = (myData.Length == 0)?"":",";
    // convert the value to a string (you can also use TryParse if the data is not trusted to be correct)
    string value = string.Format("{0:#.00}", dbl);
    // add it to the string
    myData = string.Format("{0}{1}{2}", myData, comma, value);
}
// at this point myData should be "1.20,3.40,5.60"

//---------------------------

// now we convert the string back to an array of doubles
// split the string on the delimiter
string[] parts = myData.Split(',');
// create a double array of the same length
double[] partsDouble = new double[parts.Length];

// loop through the delimited string parts,convert the values to doubles, and 
// assign them to the approriate double array index
for (int i = 0; i < parts.Length; i++)
{
    partsDouble[i] = Convert.ToDouble(parts[i]);
}


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


Member 14077625

Строка двойников не разделена. Это просто двойной массив, и исходный код C++ привел его к символу char*, а затем сделал memcpy в строку перед записью в базу данных. Если вы посмотрите на строку, хранящуюся в базе данных, или посмотрите на нее в IDE, прежде чем хранить ее в базе данных, она выглядит как тарабарщина.

#realJSOP

Покажи нам веревку.