首页 > 解决方案 > 理解 MemoryMarshal.Cast 的返回值

问题描述

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

在阅读 Microsoft 的文章All About Span: Exploring a New .NET MainstayWhat 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);

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

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

我不应该得到这个值2,因为我的字节数组的第二半是0010

标签: c#arraysmarshalling

解决方案


号码:

1

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

0x00000001
0x0001
0x01

具有大端字节模式:

0x00 0x00 0x00 0x01

还有小端字节模式:

0x01 0x00 0x00 0x00

号码:

256

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

0x00000100
0x0100

具有大端字节模式:

0x00 0x00 0x01 0x00

还有小端字节模式:

0x00 0x01 0x00 0x00

由于您的机器是 little-endian,因此MemoryMarshal.Cast使用的是 little-endian 数字表示。因此1 0 0 0被解释为10 1 0 0并被解释为256


推荐阅读