在 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):
线程 "Convert String^ in c# to CString in c++" 是从 C++ 的角度(使用 C++ 代码)而不是像我的那样来自 C# pov。我只能访问用 C# 编写的客户端。我无权访问用 C++ 编写的服务器代码,因此我无法更改服务器代码/C++ 代码的任何内容。
我通过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);
案件结案!
我正在用 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):
线程 "Convert String^ in c# to CString in c++" 是从 C++ 的角度(使用 C++ 代码)而不是像我的那样来自 C# pov。我只能访问用 C# 编写的客户端。我无权访问用 C++ 编写的服务器代码,因此我无法更改服务器代码/C++ 代码的任何内容。
我通过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);
案件结案!