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#, чтобы продвинуть вас немного дальше.

Другие вопросы по тегам