gpt4 book ai didi

java - C# - 使用两个字节而不是一个字节将字符串写入流

转载 作者:行者123 更新时间:2023-12-01 12:23:12 24 4
gpt4 key购买 nike

我正在创建一个易于使用的服务器-客户端模型,具有可扩展的协议(protocol),其中服务器采用 Java 语言,客户端可以是 Java、C# 等。

我遇到了这个问题:Java数据流写入字符串with a short designating the length ,后面是数据。

C# 让我指定我想要的编码,but it only reads one byte for the length 。 (实际上,它说“一次 7 位”...这很奇怪。这可能是我的问题的一部分?)

这是我的设置:服务器在连接后向客户端发送一个字符串。它是一个短字符串,所以第一个字节是0,第二个字节是9;该字符串的长度为 9 个字节。

//...
_socket.Connect(host, port);
var stream = new NetworkStream(_socket);
_in = new BinaryReader(stream, Encoding.UTF8);
Console.WriteLine(_in.ReadString()); //outputs nothing

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

最佳答案

如果我没记错的话,C# BinaryWriter/Reader 行为使用第 8 位来表示计数的最后一个字节的位置。这允许在单个字节中容纳最多 127 个计数,同时仍然允许更大的实际计数值(即最多 2^31-1);在这方面它有点像 UTF8。

出于您自己的目的,请注意您正在编写整个协议(protocol)(大概),因此您可以完全控制两端。您在 C# 和 Java 中描述的两种行为本质上都是由每种语言中的 helper 类实现的。没有什么说您必须使用它们,并且两种语言都提供了一种将文本直接编码为字节数组的方法,您可以根据需要发送该数组。

如果您确实想坚持使用基于 Java 的协议(protocol),可以使用 BitConvertershortbyte[] 之间进行转换> 这样您就可以明确地发送和接收这两个字节。例如:

_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

关于java - C# - 使用两个字节而不是一个字节将字符串写入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26521282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com