我正在使用Microsoft示例进行进程间通信。在example中,有两种方法可以在流中读取/写入字符串。代码发送在数据中流式传输的字符串的长度。我需要类似的代码,但需要做一些修改。对突出显示的行的解释会有所帮助。
在WriteString()
中,它们取出正在写入的字节数组的长度并将其除以256.相反的是在ReadString()
中完成,但解释了为什么使用256
会很好。然后,它通过获取长度来写入另一个字节,并使用255来写&
。我也不理解这个的原因。我认为它改变了价值,但我并不真正理解为什么需要这样做。然后在ReadString()
中,通过读取一个字节,它会在长度上+=
。对此的解释将非常有用。我是流媒体新手,只是想了解到底发生了什么以及为什么。
public string ReadString()
{
int len = 0;
// the next two lines
len = ioStream.ReadByte() * 256;
len += ioStream.ReadByte();
byte[] inBuffer = new byte[len];
ioStream.Read(inBuffer, 0, len);
return streamEncoding.GetString(inBuffer);
}
public int WriteString(string outString)
{
byte[] outBuffer = streamEncoding.GetBytes(outString);
int len = outBuffer.Length;
if (len > UInt16.MaxValue)
{
len = (int)UInt16.MaxValue;
}
// the next to lines
ioStream.WriteByte((byte)(len / 256));
ioStream.WriteByte((byte)(len & 255));
ioStream.Write(outBuffer, 0, len);
ioStream.Flush();
return outBuffer.Length + 2;
}
答案 0 :(得分:3)
这段代码很糟糕,找到一个新的教程。
256个东西用于将长度为整数的低2字节转换为字节,以便对它们进行序列化/反序列化。这不是通常的做法。使用BinaryReader/Writer
或代码不是基于乘法,而是使用二进制和移位。
除以256相当于x >> 8
。此外,这只适用于正整数。 x & 255
用于获取最低字节。这可能只是(byte)x
。有时人们为此写x % 256
,这不是惯用的,并且在签名方面存在问题。
好的代码是new byte[] { (byte)(x >> 8), (byte)(x >> 0) }
和x = bytes[1] << 8 | bytes[0]
。更简单,更快速和惯用。我喜欢写>> 0
,它不会为了对称而做任何事情。它被优化了。这对于16位整数来说可能看起来很荒谬,但是对于更长的整数,有4或8个组件,并且其中一个稍微偏离似乎是不必要的不一致。
ioStream.Read(inBuffer, 0, len);
是一个错误,因为它假定读取在一个块中完成。需要循环或再次BinaryReader
。
if (len > UInt16.MaxValue)
{
len = (int)UInt16.MaxValue;
}
我将利用这个机会警告任何阅读此内容的人:Microsoft .NET示例代码通常质量极差。非常怀疑地阅读它。