C#流字符串示例的说明

时间:2018-03-08 11:47:43

标签: c# streaming bit-manipulation

我正在使用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;
}

1 个答案:

答案 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示例代码通常质量极差。非常怀疑地阅读它。