2014-01-05 38 views
0

我有一些int值都在0-65535范围内(16位)。我需要通过TCP连接传输这些数据,所以我认为将这些值转换为字符,并发送字符,然后解码另一端的字符将符合要求。C#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的似乎仍然是有效的(但是这不是guarantied我使用try)

   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 
        { 
        } 
       } 

另结束我收到消息并将其恢复为字符串l这个。

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

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

一旦通过值转换回我回路,并打印出来,以验证一切正常(注意,被解码为索引1,字符串列表的字符串),第二位。索引应该让我回到字符串,并通过将它们转换为整数,我应该得到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:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63 :63:63:63:63:63:63:63:63: 63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:63:

这不是很完美我期望的,似乎一切都很顺利,直到我超过了第七位的价值。


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

正如几个答案所指出的那样。问题是我在这里使用的两行代码,即Encoding。导致此问题的ASCII码,而更恰当的方式而不是翻过字符将直接将数字转换为字节[],但我选择不这样做,因为我在我的工具中使用的写入/读取当前使用字符串作为输入。但这不在眼前,也就是为什么数据在另一端不匹配,因此官方文档的核心问题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); 
+1

为什么你首先编码?为什么不直接发送原始位?请注意,您需要了解“网络字节顺序”的概念。 –

+0

@PeterM正如MSDN文章中介绍的那样复制粘贴的代码,并且希望重用我已经设置的内容。说实话。我不知道为什么我编码。 – Taoh

+0

@Tach在看了那个链接之后,我建议你在通过TCP链接发送数据方面做更多的研究。这是应该取出并射击的那种代码,然后烧成灰烬,并且灰烬分散在多个位置。 (也许它适合发送短信) –

回答

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(); 
+0

@Taoh好吧,我总是试图强迫提问者尽可能地尽自己最大的努力。从长远来看,这是很重要的 - 提高研究技巧:)可能在这种情况下太多了,我会在下次尝试时更好,欢呼。 – BartoszKP

1

你为什么不只是转换你的短值,使用类似BitConverter字节数组?

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

,然后在接收端

ushort value = BitConverter.ToUInt16(...) 

还是我失去了一些东西?

相关问题