我正在尝试了解新的C#类型Span<T>
阅读微软的文章All About Span: Exploring a New .NET Mainstay时,我在What Is Span<T>?
部分的底部看到了
Spans提供了超出已经提到的众多好处。例如,跨度支持重新解释强制转换的概念,这意味着您可以将
Span<byte>
强制转换为Span<int>
(其中Span<int>
中的第0个索引映射到Span<byte>
的前四个字节)。这样,如果您读取字节缓冲区,则可以将其安全有效地传递给以int形式对分组字节进行操作的方法。
[他们在本文中未提供任何示例,但我最终在Adam Storr's article中通过使用MemoryMarshal.Cast
方法找到了执行此操作的(新方法)
但是,当我尝试这样做时,却得到一个奇怪的结果
var byteArray = new byte[] { 1,0,0,0, 0,1,0,0};
Span<byte> byteSpan = byteArray;
Span<int> intSpan = MemoryMarshal.Cast<byte, int>(byteSpan);
Microsoft的文章说the 0th index into the Span maps to the first four bytes of the Span
。因此,通过创建8个字节的数组,我得到了2个整数的跨度。
第一个整数的值是1
,这是我期望的(0001
),但是对于第二个整数,我得到的值256
,这是我不理解的。
我不应该得到值2
,因为我的字节数组的第二半是0010
吗?
数字:
1
(可以用十六进制表示为::
0x00000001
0x0001
0x01
具有大端字节模式:
0x00 0x00 0x00 0x01
和little-endian字节模式:
0x01 0x00 0x00 0x00
数字:
256
(可以用十六进制表示为::
0x00000100
0x0100
具有大端字节模式:
0x00 0x00 0x01 0x00
和little-endian字节模式:
0x00 0x01 0x00 0x00
由于您的计算机是低位优先的,因此MemoryMarshal.Cast
使用数字的低位优先的表示形式。因此,1 0 0 0
被解释为1
,0 1 0 0
被解释为256
。