C++字符* 和 C# 字节

本文关键字:字节 字符 C++ | 更新日期: 2023-09-27 18:36:22

我正在编写一个通过TCP与C#应用程序通信的C++应用程序,但我被困在这个问题上:

  • 在 C# 中,我为套接字调用 sendreceive,这将返回一个byte[]。我还使用 BitConverter.GetBytes()/BitConverter.ToInt32() 发送和接收int
  • C++我使用sendrecv作为插座。这使用 char* ,对于int,我使用 atoi()/itoa()

我如何使这两件事进行沟通?char*是某种编码中的一系列Int16吗?BitConverteratoi/itoa到底是做什么的?

C++字符* 和 C# 字节

BitConverter似乎处理您传递的整数的纯二进制值。您可以使用以下内容创建BitConverter.GetBytes()BitConverter.ToInt32 C++的等效项(假设两台计算机上的字节序相同):

void GetBytes(int32_t value, char *dest)
{
    if (!dest) return;
    memcpy(dest, &value, sizeof(value));
}
int32_t ToInt32(char *buf, size_t pos)
{
    if (!buf) return 0;
    return *(reinterpret_cast<int32_t *>(buf + pos));
}

BitConverter.GetBytes(23)将返回{0x17, 0x00, 0x00, 0x00}作为byte[],而BitConverter.ToInt32将反转操作。

atoiitoa 是 C 函数,用于将字符序列转换为它们的外观。它们是"ASCII to int"和"int to ASCII"的缩写。例如,atoi("34")会将34作为int返回。

> 在 C/C++ 中,char* 可以保存编码为 ASCII 或 UTF-8 的字符,因此这相当容易,只需按原样使用即可。

在 C# 中,您可能需要指定转换,因为 C# 使用 2 字节宽字符,例如

String s = Encoding.ASCII.GetString(my_byte_array, 0, count);

其中my_byte_array是保存您收到的字节的任何内容,count 是从 TCP 连接实际加载的字节数(应由读取它的代码报告)。

你也应该编码,像

byte[] b = Encoding.ASCII.GetBytes(my_string_to_send);
有许多

编码类型,以防您需要支持备用格式 - 例如,在 C# 中,您可以使用 Encoding.Unicode 发送 16 位宽字符,C++使用 wchar_t* 捕获它们。 在此处查看Microsoft有关 C# 编码类的文档:

https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx

我不知道你打算如何区分 Int32 和字符串,但只要你有办法,char* 和 Encoding.ASCII 应该适合你。

编辑以回答最后一个问题:atoi/itoa 只需获取一个字符串并将其转换为二进制整数或相反(例如"1234"是内存中的四个字节,包含值 49、50、51、52。 atoi("1234") 返回一个包含 1234 的 int;Itoa 与此相反,取 1234 并写入四个字节)。 位转换器不做同样的事情;相反,它在内存中占用 4 个字节,包含例如 0、0、4、210,并允许 C#.NET 将其视为整数(或任何其他类型),即使它的编码与整数完全相同。 BitConverter 相当于 C++ 中的类型转换,例如

*((int*)byte_array)

并且可能不是您想要的,具体取决于您发送文本数据或数字数据的信号方式。