首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -使用两个字节将字符串写入流长度,而不是一个字节

C# -使用两个字节将字符串写入流长度,而不是一个字节
EN

Stack Overflow用户
提问于 2014-10-23 04:24:51
回答 1查看 413关注 0票数 0

我正在创建一个易于使用的服务器-客户机模型和一个可扩展的协议,其中服务器在Java中,客户端可以是Java,C#,什么的。

我遇到了这个问题: Java数据流编写字符串用短的表示长度的,然后是数据。

C#允许我指定我想要的编码,但是它只读取一个字节的长度。。(实际上,上面写着“一次7位”.这很奇怪。这可能是我的问题之一吗?)

下面是我的设置:一旦连接到客户机,服务器就会向客户机发送一个字符串。它是一个短字符串,所以第一个字节是0,第二个字节是9;字符串是9个字节长。

代码语言:javascript
复制
//...
_socket.Connect(host, port);
var stream = new NetworkStream(_socket);
_in = new BinaryReader(stream, Encoding.UTF8);
Console.WriteLine(_in.ReadString()); //outputs nothing

在读取字符串之前读取单个字节,当然会输出预期的字符串。但是,如何将流读取器设置为使用两个字节(而不是一个字节)读取字符串?我需要子类BinaryReader并重写ReadString()吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-23 04:40:37

如果我没记错的话,C# BinaryWriter/Reader行为使用第8位来表示计数的最后一个字节在哪里。这样,最多可容纳127个字节,而实际计数值仍然要大得多(即高达2^31-1);在这方面它有点像UTF8。

为了您自己的目的,请注意,您正在编写整个协议(大概),因此您可以完全控制两端。在C#和Java中,您描述的这两种行为都是由每种语言中本质上的助手类实现的。这两种语言都提供了一种方法,可以将文本直接编码成一个字节数组,您可以随意发送这些字节。

如果您确实想坚持使用基于Java的协议,可以使用BitConvertershort之间转换为byte[],这样就可以显式地发送和接收这两个字节。例如:

代码语言:javascript
复制
_in = new BinaryReader(stream, Encoding.UTF8);
byte[] header = _in.ReadBytes(2);
short count = BitConverter.ToInt16(header, 0);
byte[] data = _in.ReadBytes(count);
string text = Encoding.UTF8.GetString(data);
Console.WriteLine(text); // outputs something
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26521282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档