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

时间:2014-01-05 17:55:39

标签: c# tcp

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

首先我创建一个字符串(消息)然后我将数字转换为字符并在消息的末尾添加它们

        String unencodedMessage = "";

        for (int i = 0; i < 513; i++)
        {
            unencodedMessage += (char)i;
        }

然后我将此消息与要使用的TcpClient(GetMessage()和GetClient()一起编辑。根据需要转换文本(从http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient%28v=vs.110%29.aspx复制粘贴)验证TcpClient是否仍然有效(但是因为这不保证我使用试试)。

                Byte[] data = System.Text.Encoding.ASCII.GetBytes(internalMessages[i].GetMessage());
                TcpClient tmpClient = internalMessages[i].GetClient();
                if (tmpClient.Connected)
                {
                    try
                    {
                        NetworkStream stream = internalMessages[i].GetClient().GetStream();
                        stream.Write(data, 0, data.Length);
                    }
                    catch
                    {
                    }
                }

在另一端,我收到消息并将其恢复为这样的字符串。

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

                numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length);
                internalMessage += Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead);
            }

一旦转换回来,我循环遍历值并打印它们以验证一切正常(注意解码的字符串在索引1中,字符串列表中),第二个。 index应该让我回到chars,通过将它们转换为int,我应该得到0-65535,我将这些文本作为一个新的字符串中的文本分隔为:并将它们写入1中去。

        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);
        }

我希望从1:2:3开始计算:...:512:513:而不是我

  

块引用   0:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17:18:19:20:21:22:23:24: 25:26:27:28:29:30:31:32:33:34:35:36:37:38:39:40:41:42:43:44:45:46:47:48:49: 50:51:52:53:54:55:56:57:58:59:60:61:62:63:64:65:66:67:68:69:70:71:72:73:74: 75:76:77:78:79:80:81:82:83:84:85:86:87:88:89:90:91:92:93:94:95:96:97:98:99: 100:101:102:103:104:105:106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123:124: 125:126:127:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:6 3:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:

这不是我所期望的,似乎一切顺利,直到我超过了第7位的价值。


我做错了什么?什么是一种更聪明的方法来尝试运送价值(预期范围0-10000)。我可以将该值作为纯文本发送,我只是觉得这很浪费。

正如几个答案所指出的那样。问题是我在这里使用的两条线,导致问题的Encoding.ASCII,更合适的方式而不是越过Chars将数字直接转换为Byte [],但我选择不做因此,我在我的工具中使用的写/读当前使用字符串作为输入。但这就是眼前的问题,即为什么数据在另一端不匹配,因此来自官方文档的核心问题Encoding.ASCII给出了这个问题。

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

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

工作线。

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

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

2 个答案:

答案 0 :(得分:2)

这是因为您使用的是ASCII编码,其中包含:

  

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

事实上,可能没有其他编码能够满足您的需求(可能,因为很难猜出您的需求是什么) - 如果他们遇到一个他们无法编码的字节,所有使用某些后备字符,你似乎只是将一些随机字节放入一个字符串。

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

因此,如果您想发送字符串中的文字,请使用:data = Encoding.UnicodeEncoding.GetBytes(unencodedMessage);(或UTF16,如您所述。否则,如果要发送一些任意值:

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

答案 1 :(得分:1)

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

byte[] bytes = BitConverter.GetBytes(...)

然后在接收端

ushort value = BitConverter.ToUInt16(...)

或者我错过了什么?