C#TCP尝试将值作为字符发送

C#TCP尝试将值作为字符发送,c#,tcp,C#,Tcp,我有一些int值,它们都在0-65535范围内(16位)。我需要通过TCP连接传输这些数据,所以我认为将这些值转换为字符,并发送字符,然后在另一端解码字符将符合要求 首先创建一个字符串(消息),然后将数字转换为字符,并将其添加到消息末尾 String unencodedMessage = ""; for (int i = 0; i < 513; i++) { unencodedMessage += (char)i;

我有一些int值,它们都在0-65535范围内(16位)。我需要通过TCP连接传输这些数据,所以我认为将这些值转换为字符,并发送字符,然后在另一端解码字符将符合要求

首先创建一个字符串(消息),然后将数字转换为字符,并将其添加到消息末尾

        String unencodedMessage = "";

        for (int i = 0; i < 513; i++)
        {
            unencodedMessage += (char)i;
        }
在另一端,我收到消息并将其还原为如下字符串

            while (stream.DataAvailable)
            {
                int numberOfBytesRead = 0;

                numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length);
                internalMessage += Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead);
            }
转换回来后,我循环遍历这些值并打印它们,以验证一切正常(注意,解码的字符串位于字符串列表的索引1中),第二个。索引应该会将字符返回给我,通过将这些字符转换为整数,我应该会得到0-65535,我将这些字符作为文本以一个新的字符串进行描述,以:分隔,并将它们写在一个go中

        public void UnencodeData(List<String> command)
        {
            String msg = "";
            for(int i = 0; i < command[1].Count();i++)
            {
                msg += ((int)command[1][i]) + ":";
            }
            Console.WriteLine(msg);
        }

工作线

    Byte[] data = System.Text.Encoding.Unicode.GetBytes(internalMessages[i].GetMessage());

internalMessage += Encoding.Unicode.GetString(myReadBuffer, 0, numberOfBytesRead);

这是因为您正在使用编码,其中:

ASCII字符限制为最低的128个Unicode字符,从U+0000到U+007F

事实上,可能其他编码都不适合您的需要(可能,因为很难猜出您的需要是什么)-如果遇到无法编码的字节,所有编码都会使用某种回退字符,而您似乎只是将一些随机字节放入字符串中

最简单的解决方案似乎是使用一个。如果你真的想要字符串,你也可以考虑编码。

因此,如果您想发送字符串中的文本,只需使用:
data=Encoding.unicodeincoding.GetBytes(unencodedMessage)(或您自己注意到的
UTF16
)。否则,如果要发送一些任意值:

data = unencodedMessage.SelectMany(c => BitConverter.GetBytes(c)).ToArray();

这是因为您正在使用编码,其中:

ASCII字符限制为最低的128个Unicode字符,从U+0000到U+007F

事实上,可能其他编码都不适合您的需要(可能,因为很难猜出您的需要是什么)-如果遇到无法编码的字节,所有编码都会使用某种回退字符,而您似乎只是将一些随机字节放入字符串中

最简单的解决方案似乎是使用一个。如果你真的想要字符串,你也可以考虑编码。

因此,如果您想发送字符串中的文本,只需使用:
data=Encoding.unicodeincoding.GetBytes(unencodedMessage)(或您自己注意到的
UTF16
)。否则,如果要发送一些任意值:

data = unencodedMessage.SelectMany(c => BitConverter.GetBytes(c)).ToArray();

这是因为您正在使用编码,其中:

ASCII字符限制为最低的128个Unicode字符,从U+0000到U+007F

事实上,可能其他编码都不适合您的需要(可能,因为很难猜出您的需要是什么)-如果遇到无法编码的字节,所有编码都会使用某种回退字符,而您似乎只是将一些随机字节放入字符串中

最简单的解决方案似乎是使用一个。如果你真的想要字符串,你也可以考虑编码。

因此,如果您想发送字符串中的文本,只需使用:
data=Encoding.unicodeincoding.GetBytes(unencodedMessage)(或您自己注意到的
UTF16
)。否则,如果要发送一些任意值:

data = unencodedMessage.SelectMany(c => BitConverter.GetBytes(c)).ToArray();

这是因为您正在使用编码,其中:

ASCII字符限制为最低的128个Unicode字符,从U+0000到U+007F

事实上,可能其他编码都不适合您的需要(可能,因为很难猜出您的需要是什么)-如果遇到无法编码的字节,所有编码都会使用某种回退字符,而您似乎只是将一些随机字节放入字符串中

最简单的解决方案似乎是使用一个。如果你真的想要字符串,你也可以考虑编码。

因此,如果您想发送字符串中的文本,只需使用:
data=Encoding.unicodeincoding.GetBytes(unencodedMessage)(或您自己注意到的
UTF16
)。否则,如果要发送一些任意值:

data = unencodedMessage.SelectMany(c => BitConverter.GetBytes(c)).ToArray();

为什么不使用位转换器之类的东西将短值转换为字节数组

byte[] bytes = BitConverter.GetBytes(...)
然后在接收端

ushort value = BitConverter.ToUInt16(...)

还是我遗漏了什么?

为什么不使用类似位转换器的东西将短值转换为字节数组

byte[] bytes = BitConverter.GetBytes(...)
然后在接收端

ushort value = BitConverter.ToUInt16(...)

还是我遗漏了什么?

为什么不使用类似位转换器的东西将短值转换为字节数组

byte[] bytes = BitConverter.GetBytes(...)
然后在接收端

ushort value = BitConverter.ToUInt16(...)

还是我遗漏了什么?

为什么不使用类似位转换器的东西将短值转换为字节数组

byte[] bytes = BitConverter.GetBytes(...)
然后在接收端

ushort value = BitConverter.ToUInt16(...)


还是我遗漏了什么?

为什么要先编码?为什么不直接发送原始数据呢?注意:您需要理解
网络字节顺序
@PeterM的概念,如MSDN文章中所述复制粘贴的代码,并希望重用我已经设置的内容。所以说实话。我不知道我为什么要编码。@Tach在查看该链接后,我建议您对通过TCP链接发送数据进行更多研究。这类代码应该被取出并拍摄,然后烧成灰烬,灰烬散落在多个地方。(也许它适合发送短信)@PeterM得知官方指南的质量很高,这让人感到欣慰。除非你参考的是我的代码,在这种情况下,我必须承认,我是一个新手,我只想能够将一个字符串从a发送到B并进行解码。怎么做不太重要。字符串插入,相同的字符串在另一端输出;)<代码>我可能完全误解了序列化程序
你是对的,你完全误解了。xml和json(如我前面的链接中所示)与语言无关。这就是为什么它们被用于不同平台之间的数据传递(比如twitter、facebook、google API),为什么首先要编码?为什么不直接发送原始数据呢?请注意,您将看到