我正在编写一个C ++应用程序,它通过TCP与C#应用程序进行通信,我一直坚持这个问题:
send
和receive
,并返回byte[]
。我还使用int
/ BitConverter.GetBytes()
发送和接收BitConverter.ToInt32()
。send
和recv
作为套接字。这使用char*
,int
使用atoi()
/ itoa()
。我如何让这两件事情沟通?
某些编码中char*
是一系列Int16
吗?
BitConverter
和atoi
/ itoa
真正做了什么?
答案 0 :(得分:1)
在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 *来捕获它们。请在此处查看有关C#编码类的Microsoft文档:
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个字节)。 BitConverter不会做同样的事情;相反,它在内存中占用4个字节,包含例如0,0,4,210并允许C#.NET将其视为整数(或任何其他类型),即使它完全按整数编码也是如此。 BitConverter相当于C ++中的类型转换,比如
*((int*)byte_array)
可能不是您想要的,具体取决于您发送文本或数字数据的方式。
答案 1 :(得分:1)
BitConverter
似乎处理您传递的整数的纯二进制值。您可以使用以下内容在C ++中创建BitConverter.GetBytes()
和BitConverter.ToInt32
的等效项(假设两台计算机上具有相同的字节顺序):
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函数,可将字符序列转换为它们所显示的字符。它们是&#34; ASCII到int&#34;和&#34; int到ASCII&#34;。例如,atoi("34")
会将34
作为int
返回。