【问题标题】:C++ equivalent to C# Encoding.ASCII.GetString()C++ 等价于 C# Encoding.ASCII.GetString()
【发布时间】:2021-07-20 21:36:30
【问题描述】:

我在 C# 中有一个 UDP 套接字,它使用以下代码发送消息

newsock.Send(sendBuffer, sendBuffer.Length, sender);

其中sendBufferbyte[] 数据类型。

当我在用 C++ 编写的 UDP 套接字中收到此消息时,如何转换它?

C++ 代码如下:

recvfrom(socket_desc, client_message, sizeof(client_message), 0,(struct sockaddr*)&client_addr, &client_struct_length)

【问题讨论】:

    标签: c# c++ udp


    【解决方案1】:

    client_message 中已经有原始字节,recvfrom() 将返回消息的字节长度。如果数据是真正的 ASCII 数据,那么只需将数据原样用作char 字符串,无需转换。

    但是,如果您需要 C++ std::string,它有一个构造函数,该构造函数将 char* 和长度作为输入参数。

    另一方面,如果您确实需要 Unicode 字符串(即 Encoding.GetString() 返回的内容),您可以使用 Win32 的 MultiByteToWideChar() 函数或等效函数,将 ASCII 指定为要转换的字符集。

    【讨论】:

    • 我发送这样的消息:``` bytes.Clear(); lX = 1; lY = 1; lZ = 1; bytes.AddRange(BitConverter.GetBytes(lX)); bytes.AddRange(BitConverter.GetBytes(lY)); bytes.AddRange(BitConverter.GetBytes(lZ)); sendBuffer = bytes.ToArray(); ``` 我收到这样的消息:``` "\0\0\0\0\0\0ð?\0\0\0\0\0\0ð?\0\0\0\0\ 0\0ð?0\0\0\0" ```
    • 这甚至不是文本,更不用说 ASCII 文本了,那么你为什么要求使用 Encoding.GetString() 等效项转换该数据呢?您的数据包含 3 个二进制 64 位整数,因此只需将 client_message 字节原样复制到 int64_t[3] 数组中,例如:int64_t nums[3]; memcpy(nums, client_message, sizeof(int64_t)*3); /* use nums[0]..nums[2] as needed... */ 或将指向 client_message 本身的指针类型转换为 int64_t* 指针,例如:int64_t *nums = (int64_t*)client_message; /* use nums[0]..nums[2] as needed... */.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2011-09-19
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多