Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#字符串多字节C++,gif二进制数据转换为png或图像_C#_Image_Bytearray_Gif_Multibyte - Fatal编程技术网

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

C#字符串多字节C++,gif二进制数据转换为png或图像,c#,image,bytearray,gif,multibyte,C#,Image,Bytearray,Gif,Multibyte,我真的陷入了这个问题。 造成这个问题的原因是我对C#概念不了解。 我只想做的是电子设备返回gif格式的数据。我相信这是二元的。 所以我想把这些数据转换成图像 ///下面是发送命令到我想要的仪器“返回.gif格式的显示图像” 所以我收到了来自仪器的gif数据,手册上说这是“以.gif格式返回显示图像”==>我相信这是二进制格式。 下面的链接是字符串图像格式中的内容。 字符串图像格式 我的目标是将此字符串转换为图像文件。(png或jpg,无论什么) 所以我把这个字符串变量转换成字节数组。 下面是我

我真的陷入了这个问题。 造成这个问题的原因是我对C#概念不了解。 我只想做的是电子设备返回gif格式的数据。我相信这是二元的。 所以我想把这些数据转换成图像

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

所以我收到了来自仪器的gif数据,手册上说这是“以.gif格式返回显示图像”==>我相信这是二进制格式。 下面的链接是字符串图像格式中的内容。 字符串图像格式

我的目标是将此字符串转换为图像文件。(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++代码使用了字符串多字节?(刚刚收到他的信) 我没有用C++的EXP。 如果我遵循这个C++代码,那么工作。 我的目标是用C#实现。所以需要遵循C++代码。
请给出我的问题。

< P>如果你不熟悉C++,就可能会把C++移植到C语言中(有时不必介意!):有一件事要牢记:C++中没有“字节”类型。相反,二进制数据存储在char[]数组中,就像C字符串一样

另一方面,C#区分了两者。因此,当你看到C++中的一个字符用于存储二进制数据而不是字符数据时,C++等价物是字节[],不是char []或String。 “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”对象的足够信息。许多I/O API允许对可用数据进行部分读取,因此您可能需要以循环方式从设备中读取数据,直到(不知何故)知道您已收到映像的所有可用字节。或者,您用于“my6705B”对象的类型可以为您处理所有这些。我没办法知道…你得自己弄清楚


但是,希望上面的内容能使你对C++和C的问题有足够的了解,让你有点进一步了解。

基本上,你根本不应该接收二进制数据作为<代码>字符串< /> >。不清楚什么是<代码> MY6705B,但理想的是读取二进制数据,而不是字符串。谢谢彼得,你说的对,关键是C++ [CAR] [~]是~~~ [C~(2])字节数组[],这是工作。有一个问题是,有一个仪器api放在byte[]数组中。非常感谢你的建议。
byte[] image_format = my6705B.ReadBytes();
MemoryStream ms4 = new MemoryStream(image_format);
Image image = Image.FromStream(ms4);
image.Save(@"C:\Users\Administrator\Desktop\imageTest.png");