C#解释流字符串例子

C# Explanation of stream string example

我正在使用 Microsoft 示例进行进程间通信。在 example 中有两种方法用于 reading/writing 一个字符串 to/from 一个流。该代码发送数据中流式传输的字符串的长度。我需要类似的代码,但需要进行一些修改。对突出显示的行进行解释会有所帮助。

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;
}

这段代码不好,找一个新的教程。

256 的内容是将长度整数的低 2 字节转换为字节,以便 serialize/deserialize 它们。这不是通常的做法。使用 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 示例代码通常质量极差。带着极大的怀疑阅读它。