C# строка многобайтовая C++, GIF двоичные данные преобразовать в PNG или изображение
Я серьезно застрял в этой проблеме. эта проблема вызвана тем, что я слаб с концепцией C#. все, что я хочу сделать, это электронное оборудование вернуть данные в формате GIF. который является двоичным, я верю. поэтому я хочу преобразовать эти данные в изображение.
/// ниже просто отправить команду на инструмент, который я хочу "Возвращает изображение дисплея в формате.gif"
my6705B.WriteString("hcop:sdump:data?", true);
string image_format = my6705B.ReadString();
Поэтому я получил данные gif от прибора, руководство говорит, что это "Возвращает изображение дисплея в формате.gif" ==> Я считаю, что это двоичный формат. ссылка ниже находится в строке image_format. строка image_format
Моя цель - преобразовать эту строку в файл изображения. (png или jpg как угодно), поэтому я преобразую эту строковую переменную в байтовый массив. ниже мой код после этой команды....
//// this also couldn't work ~~~
System.Text.UnicodeEncoding encode = new System.Text.UnicodeEncoding();
byte[] byte_array22 = encode.GetBytes(image_format);
MemoryStream ms4 = new MemoryStream(byte_array22);
Image image = Image.FromStream(ms4); //// error point
image.Save(@"C:\Users\Administrator\Desktop\imageTest.png");
//// this also couldn't work ~~~
byte[] byte_array22 = Encoding.Unicode.GetBytes(image_format);
MemoryStream ms4 = new MemoryStream(byte_array22);
Image image = Image.FromStream(ms4, true, true); /// always error here,,,
image.Save(@"C:\Users\Administrator\Desktop\imageTest.png", System.Drawing.Imaging.ImageFormat.Png);
оба кода не работают, и точка ошибки одинакова. Я прокомментировал ошибку. и в любом случае строка в байтовый массив это работа. Я мучаюсь с этой проблемой несколько дней. но мой поставщик делает этот код с C++, это работает. позвольте мне поделиться кодом моего вендора. Это реализовано на C++.
char szReadBuffer[102400] = {'\0', };
char szReadBinary[102400] = {'\0', };
m_iStatus = viOpenDefaultRM(&m_vDefaultRM);
m_iStatus = viOpen(m_vDefaultRM, (LPSTR)(LPCTSTR)m_strVISA, VI_NULL, VI_NULL, (ViPSession)&m_iDevHandle);
m_iStatus = viSetAttribute(m_iDevHandle, VI_ATTR_TMO_VALUE, 15000);
m_iStatus = QueryGPIB("HCOPy:SDUMp:DATA?", szReadBuffer, sizeof(szReadBuffer));
//Store the results in a text file
CFile file;
file.Open("PICTURE.GIF", CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
memcpy(szReadBinary, &szReadBuffer[2], sizeof(szReadBuffer));
file.Write(szReadBinary, sizeof(szReadBinary));
file.Close();
я думаю, что важным моментом является то, что они заявляют. они объявляют char[] . и посоветовал мне, что этот код C++ использовал String MultiByte? (просто услышать от него) у меня нет опыта с C++. и если я следую этому коду C++, то работает.
Моя цель - реализовать с помощью C#. так что нужно следовать C++ коду.
пожалуйста, посоветуйте мою проблему.
1 ответ
Иногда может быть затруднительно портировать C++ на C#, если вы не знакомы ни с тем, ни с другим (не говоря уже о обоих!:)). Следует помнить одну вещь: в C++ нет типа "байт". Вместо этого двоичные данные хранятся в массивах char[], как и строки C.
С другой стороны, C# различает два. Поэтому, когда вы видите char[] в C++, который используется для хранения двоичных данных вместо символьных данных, эквивалентом C# является byte[], а не char[] или System.String, как это может быть для других C++ использования char[].
Ваш объект "my6705B" выглядит как некая абстракция вашего аппаратного устройства. Предположительно в дополнение к методам WriteString() и ReadString() существуют методы, которые можно использовать для записи и чтения двоичных данных, используя тип byte[] вместо символов или строк. Используйте это вместо этого.
Давайте предположим, что правильный метод называется "ReadBytes()". Тогда ваш код будет выглядеть так:
byte[] image_format = my6705B.ReadBytes();
MemoryStream ms4 = new MemoryStream(image_format);
Image image = Image.FromStream(ms4);
image.Save(@"C:\Users\Administrator\Desktop\imageTest.png");
Теперь, это может или не может быть именно то, что вам нужно. Вы не предоставили достаточно информации об объекте "my6705B". Многие API ввода / вывода допускают частичное чтение доступных данных, поэтому возможно, что вам придется читать с устройства в цикле, пока вы не узнаете (каким-то образом), что получили все доступные байты для изображения. Или, может быть, тип, который вы используете для объекта "my6705B", обрабатывает все это для вас. У меня нет возможности узнать... тебе придется самому в этом разобраться.
Но, надеюсь, вышесказанное достаточно ориентирует вас в отношении проблем C++ и C#, чтобы продвинуть вас немного дальше.