【发布时间】:2021-01-30 17:18:26
【问题描述】:
我一辈子都无法理解 Span 的 Range 运算符背后的逻辑。
我有一个包含 IP 协议标头的以下字节数组:
---------------------------------------------------------------------------------
| | | | | | | | | | | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 9 |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---------------------------------------------------------------------------------
| other data | src ip | dest ip |
---------------------------------------------------------------------------------
使用范围运算符,我需要使用以下值来提取正确的 4 字节数组:
Span<byte> ipHeader = ethernetFrame.IPHeader;
byte[] sourceIpAddress = ipHeader[12..16].ToArray();
byte[] destinationIpAddress = ipHeader[16..20].ToArray();
如果我使用 Slice 方法,我会得到:
Span<byte> ipHeader = ethernetFrame.IPHeader;
byte[] sourceIpAddress = ipHeader.Slice(12, 4).ToArray();
byte[] destinationIpAddress = ipHeader.Slice(16, 4).ToArray();
范围运算符背后的逻辑是什么要求我给出一个超过实际结束索引值 1 的结束值?
从性能的角度来看,我也很好奇(因为这个特定的代码块每分钟运行数百万次),无论如何使用 Slice 会更高效吗?
【问题讨论】: