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