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