У меня очень болезненная библиотека, которая на данный момент принимает строку C # как способ получения массивов данных; по-видимому, это облегчает сортировку для pinvokes.
Так как мне сделать массив ushort в строку байтами? Я пробовал:
int i;
String theOutData = "";
ushort[] theImageData = inImageData.DataArray;
//this is as slow like molasses in January
for (i = 0; i < theImageData.Length; i++) {
byte[] theBytes = System.BitConverter.GetBytes(theImageData[i]);
theOutData += String.Format("{0:d}{1:d}", theBytes[0], theBytes[1]);
}
Я могу сделать это таким образом, но это не заканчивается ни в каком отдаленном приближении к разумному количеству времени.
Что мне здесь делать? Идти небезопасно? Пройдите какое-нибудь промежуточное IntPtr?
Если бы это был символ * в C ++, это было бы значительно проще ...
редактировать: вызов функции
DataElement.SetByteValue(string inArray, VL Length);
где VL - это «длина значения», тип DICOM, а сама функция генерируется SWIG в качестве оболочки для библиотеки C ++. Кажется, что выбранное представление является строковым, потому что оно может относительно легко пересекать управляемые / неуправляемые границы, но во всем коде C ++ в проекте (это GDCM) char * просто используется в качестве байтового буфера. Поэтому, когда вы хотите установить указатель на буфер изображения, в C ++ это довольно просто, но в C # я застрял с этой странной проблемой.
Это хакерация, и я знаю, что, вероятно, лучше всего заставить библиотеку SWIG работать правильно. Я действительно не знаю, как это сделать, и предпочел бы быстрый обходной путь на стороне C #, если таковой существует.