C#字符串多字节c ++,gif二进制数据转换为png或image

时间:2014-10-16 18:02:29

标签: c# image bytearray gif multibyte

我严重陷入了这个问题。 引起这个问题是因为我对C#概念很弱。 我想做的就是电子设备返回gif格式数据。这是二进制我相信。 所以我想将这些数据转换为图像。

///下面只是发送命令到我想要的仪器“返回.gif格式的显示图像”

    my6705B.WriteString("hcop:sdump:data?", true);
    string image_format = my6705B.ReadString();

所以我收到了乐器的gif数据,手册说这是“返回.gif格式的显示图像”==>我相信这是二进制格式。 下面的链接是字符串image_format中的内容。 string image_format http://i.stack.imgur.com/UcYqV.png

我的目标是将此字符串转换为图像文件。 (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 ++的exp。 如果我按照这个c ++代码然后工作。

我的目标是用C#实现。所以需要遵循C ++代码。

请告诉我的问题。

1 个答案:

答案 0 :(得分:0)

如果你不熟悉其中一个,那么将C ++移植到C#有时会让人感到困惑(不要介意两者!:))。要记住一件事:没有"字节"用C ++输入。相反,二进制数据存储在char []数组中,就像C字符串一样。

另一方面,C#区分了两者。因此,当您在C ++中看到用于存储二进制数据而不是字符数据的char []时,C#等价物是一个byte [],而不是char []或System.String,因为它可能用于其他C ++使用char []。

你的" my6705B"对象似乎是您的硬件设备的某种抽象。据推测,除了WriteString()和ReadString()方法之外,还有一些方法可以使用byte []类型而不是字符或字符串来编写和读取二进制数据。请改用它。

让我们假设正确的方法被命名为#34; 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"宾语。许多I / O API允许部分读取可用数据,因此您可能需要在循环中读取设备,直到您知道(某种方式)您已收到所有可用字节为止图片。或者也许是你用于" my6705B"的类型。对象处理所有为您。我无从知晓......你必须自己解决这个问题。

但是希望上面的内容能让你在C ++和C#问题上取得足够的进展,以便让你更进一步。