C++字符* 和 C# 字节
本文关键字:字节 字符 C++ | 更新日期: 2023-09-27 18:36:22
我正在编写一个通过TCP与C#应用程序通信的C++应用程序,但我被困在这个问题上:
- 在 C# 中,我为套接字调用
send
和receive
,这将返回一个byte[]
。我还使用BitConverter.GetBytes()
/BitConverter.ToInt32()
发送和接收int
。 - C++我使用
send
和recv
作为插座。这使用char*
,对于int
,我使用atoi()
/itoa()
。
我如何使这两件事进行沟通?char*
是某种编码中的一系列Int16
吗?BitConverter
和atoi
/itoa
到底是做什么的?
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
将反转操作。
atoi
和 itoa
是 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)
并且可能不是您想要的,具体取决于您发送文本数据或数字数据的信号方式。