C ++ char *和C#字节

时间:2016-02-26 20:09:40

标签: c# c++ winsock

我正在编写一个C ++应用程序,它通过TCP与C#应用程序进行通信,我一直坚持这个问题:

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

我如何让这两件事情沟通? 某些编码中char*是一系列Int16吗? BitConverteratoi / itoa真正做了什么?

2 个答案:

答案 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会撤消操作。

atoiitoa是C函数,可将字符序列转换为它们所显示的字符。它们是&#34; ASCII到int&#34;和&#34; int到ASCII&#34;。例如,atoi("34")会将34作为int返回。