我有一些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);
为什么你首先编码?为什么不直接发送原始位?请注意,您需要了解“网络字节顺序”的概念。 –
@PeterM正如MSDN文章中介绍的那样复制粘贴的代码,并且希望重用我已经设置的内容。说实话。我不知道为什么我编码。 – Taoh
@Tach在看了那个链接之后,我建议你在通过TCP链接发送数据方面做更多的研究。这是应该取出并射击的那种代码,然后烧成灰烬,并且灰烬分散在多个位置。 (也许它适合发送短信) –