了解MemoryMarshal.Cast的返回值

问题描述 投票:1回答:1

我正在尝试了解新的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吗?

c# arrays marshalling
1个回答
0
投票

数字:

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被解释为10 1 0 0被解释为256

© www.soinside.com 2019 - 2024. All rights reserved.