【发布时间】:2020-10-19 13:00:58
【问题描述】:
我正在查看一些其他人编写的代码,如下所示:
protected override void CloseAndSend(BinaryWriter request, uint lengthPos)
{
request.Seek((int)lengthPos, SeekOrigin.Begin);
request.Write(IPAddress.HostToNetworkOrder((int)(request.BaseStream.Length - lengthPos - sizeof(int))));
//more code here.
}
我知道 IPAddress.HostToNetworkOrder 确保使用适当的字节序,但是争论的目的是什么,即(int)(request.BaseStream.Length - lengthPos - sizeof(int)))?我读过这个:https://docs.microsoft.com/en-us/dotnet/api/system.net.ipaddress.hosttonetworkorder?view=netcore-3.1。我找不到任何例子,因此找不到问题的原因。我花了两个小时在谷歌上搜索它。
更新
这是填充 BinaryWriter 的代码(按正确顺序):
byte EOL = 0;
BinaryWriter writer = new BinaryWriter(new MemoryStream());
writer.Write(UTF8Encoding.UTF8.GetBytes("API"));
writer.Write(EOL);
writer.Write((int)0);
writer.Write(UTF8Encoding.ASCII.GetBytes("v100..155"));
//request.BaseStream.Length - lengthPos - sizeof(int)=9
//writer.BaseStream.Length=17
【问题讨论】:
-
是转换为网络顺序的数字。你想写一个二进制形式的数字,但你不知道当前使用的是大端还是小端,所以如果需要,你可以使用这种方法转换为网络顺序(大端)。
-
@Evk,谢谢。您不必转换整个流吗?
-
看起来区别是大端和小端。请参阅:docs.microsoft.com/en-us/dotnet/api/…。它在链接(或您的链接)的备注中。
-
@jdweng,我在我的问题中发布了该链接。你知道你不会转换整个流的任何场景吗?
-
是的,如果数据不是全部 int32(4 字节数据)。
标签: c# network-programming endianness