我严重陷入了这个问题。 引起这个问题是因为我对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 ++代码。
请告诉我的问题。
答案 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#问题上取得足够的进展,以便让你更进一步。