了解 MemoryMarshal.Cast 的返回值

Jér*_*VEL 8 c# arrays marshalling

我正在尝试理解新的 C# 类型Span<T>

在阅读 Microsoft 的文章All About Span: Exploring a New Mainstay时,我在该What Is Span<T>?部分的底部看到了

除了已经提到的之外,跨度还提供了许多好处。例如,span 支持重新解释强制转换的概念,这意味着您可以将 a 强制转换Span<byte>为 a Span<int>(其中第 0 个Span<int>索引映射到 的前四个字节)Span<byte>。这样,如果您读取字节缓冲区,则可以将其传递给安全有效地以整数形式对分组字节进行操作的方法。

他们在本文中没有提供任何示例,但我最终在Adam Storr 的文章中使用以下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);
Run Code Online (Sandbox Code Playgroud)

微软的文章说the 0th index into the Span maps to the first four bytes of the Span。因此,通过创建 8 个字节的数组,我得到了 2 个整数的 Span。

第一个整数的值是1我所期望的(0001),但对于第二个整数,我得到的值256是我不理解的值。

我是否不应该获取该值,2因为我的字节数组的第二半是0010

can*_*on7 7

号码:

1
Run Code Online (Sandbox Code Playgroud)

(可以用十六进制写为):

0x00000001
0x0001
0x01
Run Code Online (Sandbox Code Playgroud)

具有大端字节模式:

0x00 0x00 0x00 0x01
Run Code Online (Sandbox Code Playgroud)

以及小端字节模式:

0x01 0x00 0x00 0x00
Run Code Online (Sandbox Code Playgroud)

号码:

256
Run Code Online (Sandbox Code Playgroud)

(可以用十六进制写为):

0x00000100
0x0100
Run Code Online (Sandbox Code Playgroud)

具有大端字节模式:

0x00 0x00 0x01 0x00
Run Code Online (Sandbox Code Playgroud)

以及小端字节模式:

0x00 0x01 0x00 0x00
Run Code Online (Sandbox Code Playgroud)

由于您的机器是小端字节序,因此MemoryMarshal.Cast使用数字的小端字节表示形式。因此1 0 0 0被解释为1,并被0 1 0 0解释为256