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 示例代码通常质量极差。带着极大的怀疑阅读它。
我正在使用 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 示例代码通常质量极差。带着极大的怀疑阅读它。