【问题标题】:C# string multi-byte c++ , gif binary data convert to png or imageC#字符串多字节c++,gif二进制数据转换为png或图像
【发布时间】:2014-10-16 18:02:28
【问题描述】:

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

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

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

所以我从仪器收到 gif 数据,手册说这是“以 .gif 格式返回显示图像” ==> 我相信这是二进制格式。 下面的链接是字符串 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++ 没有经验。 如果我遵循这个 c++ 代码然后工作。

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

请提出我的问题。

【问题讨论】:

  • 基本上你不应该以string 的形式接收二进制数据。目前尚不清楚my6705B 是什么,但理想情况下您应该读取二进制 数据,而不是字符串。

标签: c# image bytearray gif multibyte


【解决方案1】:

如果您不熟悉其中一个,有时将 C++ 移植到 C# 可能会令人困惑(两者都不要介意!:))。要记住的一件事:C++ 中没有“字节”类型。相反,二进制数据存储在 char[] 数组中,就像 C 字符串一样。

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

您的“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# 问题,让您更进一步。

【讨论】:

  • 谢谢彼得,,,你说得对,关键是C++ char [] 在C# byte[] 数组中是~~~,,,,,这是工作。一个问题是有仪器 api 放入 byte[] 数组。非常感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2014-03-29
  • 2014-06-14
  • 2020-05-06
  • 2011-08-23
  • 2017-02-23
相关资源
最近更新 更多