在 C# 项目中将 C# 字符串转换为 MFC CString?

Convert C# String to MFC CString in C# project?

我正在用 C# 开发客户端。服务器是由其他使用 C++ MFC 的人开发的,所以我无法更改它。服务器只能接受字符串数据作为 CString (UTF8)。 注意:在我问这个问题之前,我已经搜索并阅读了许多主题,例如。 thread1, thread2, thread3,等等。但他们谈论的是 C++ 项目或 C++ 上下文中的转换(从 CString 到其他或从 C++ String 到 CString 等),而且他们不在 C# 中。

请提供示例代码或指向 link 以帮助我。提前谢谢你。

下面是我的示例代码。这是一个 C# 控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        String strHello = "Hello in C# String"; // immutable

        // How to convert ito MFC CString equivalent? CString is mutable.

    }
}

补充信息(1):

  1. 线程 "Convert String^ in c# to CString in c++" 是从 C++ 的角度(使用 C++ 代码)而不是像我的那样来自 C# pov。我只能访问用 C# 编写的客户端。我无权访问用 C++ 编写的服务器代码,因此我无法更改服务器代码/C++ 代码的任何内容。

  2. 我通过TCP发送数据。连接建立成功。在服务器端,接收器 (OnReceiveData) 使用 CString 作为参数。以下是我的发送数据代码(在使用 Agent Ron 的回答之后)。仍然不起作用,意味着:服务器仍然忽略数据。

            tcpClient = new TcpClient(hostname, port);
            Byte[] data = Encoding.UTF8.GetBytes(message);   
            NetworkStream stream = _client.GetStream();
            StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
            writer.AutoFlush = false;
            writer.Write(data.Length);
            writer.Write(message);
            writer.Flush();
    

补充信息(2):

终于可以联系到服务器的开发者了。他不告诉我服务器的代码,只给了我他的C++客户端的代码片段,他说可以在他的服务器上使用。

int XmlClient::SendLine( const CString& strSend )
{
    char* source = CConversion::TcharToChar( strSend ); // UTF8 conversion
    int length = strlen( source );
    char* tmp = new char[length+3];
    memcpy_s( tmp, length+3, source, length );
    tmp[ length ] = '[=12=]';
    strcat_s( tmp, length+3, "\r\n" );
    Send( tmp, length +2 );
    delete[] tmp;
    delete[] source;
    return 0;
}

在不知道如何与 C++ MFC 代码交互的情况下很难回答,但如果您只需要一个 UTF-8 字节数组,您可以这样做:

byte[] utf8data = Encoding.UTF8.GetBytes(strHello);

响应更新

我怀疑您可能想使用 BinaryWriter instead of StreamWriter. You may also need to do endianness conversion on the length integer see this thread, and this blog post 作为示例)。

服务器终于接受了我的客户端发送的数据。这是解决方案: - 将原始字符串编码为 UTF8 并附加“\r\n”。 - 打开网络流。 - 无需使用任何编写器即可直接发送。

尽管如此,我还是要感谢大家通过展示找到解决方案的可能方向来帮助我。

            // Translate the passed message into UTF8 and store it as a Byte array.
            Byte[] utf8source = UTF8Encoding.UTF8.GetBytes(strHello);
            Byte[] suffix = UTF8Encoding.UTF8.GetBytes("\r\n");
            Byte[] utf8Result = new byte[utf8source.Length + suffix.Length];
            Buffer.BlockCopy(utf8source, 0, utf8Result, 0, utf8source.Length);
            Buffer.BlockCopy(suffix, 0, utf8Result, utf8source.Length, suffix.Length);

            // Send the message to the connected TcpServer. 
            NetworkStream stream = _client.GetStream();
            stream.Write(utf8Result, 0, utf8Result.Length);

案件结案!