C# 了解MemoryMarshal.Cast的返回值
我试图理解新的C#typeC# 了解MemoryMarshal.Cast的返回值,c#,arrays,marshalling,C#,Arrays,Marshalling,我试图理解新的C#typeSpan 在阅读微软的文章时,我看到了什么是Span?部分的底部 跨度提供了许多超出前面提到的好处。例如,Span支持重新解释强制转换的概念,这意味着您可以将Span强制转换为Span(其中Span的第0个索引映射到Span的前四个字节)。这样,如果您读取一个字节缓冲区,就可以将它传递给安全有效地将分组字节作为int进行操作的方法 本文中没有提供任何示例,但我最终通过使用MemoryMarshal.Cast方法找到了实现这一点的(新方法) 然而,当我尝试这样做时,我得到
Span
在阅读微软的文章时,我看到了什么是Span?
部分的底部
跨度提供了许多超出前面提到的好处。例如,Span支持重新解释强制转换的概念,这意味着您可以将Span
强制转换为Span
(其中Span
的第0个索引映射到Span
的前四个字节)。这样,如果您读取一个字节缓冲区,就可以将它传递给安全有效地将分组字节作为int进行操作的方法
本文中没有提供任何示例,但我最终通过使用MemoryMarshal.Cast
方法找到了实现这一点的(新方法)
然而,当我尝试这样做时,我得到了一个奇怪的结果
var byteArray=新字节[]{1,0,0,0,1,0,0};
Span byteSpan=byteArray;
Span intSpan=MemoryMarshal.Cast(byteSpan);
微软的文章说,Span的第0个索引映射到Span的前四个字节。因此,通过创建一个8字节的数组,我得到了2个整数的跨度
第一个整数的值是1
,这是我所期望的(0001
),但第二个整数的值是256
,这是我不理解的
我不应该得到值2
,因为我的字节数组的后半部分是0010
?数字:
1
256
(可以用十六进制写为):
具有大端字节模式:
0x00 0x00 0x00 0x01
0x01 0x00 0x00 0x00
0x00 0x00 0x01 0x00
0x00 0x01 0x00 0x00
以及小端字节模式:
0x00 0x00 0x00 0x01
0x01 0x00 0x00 0x00
0x00 0x00 0x01 0x00
0x00 0x01 0x00 0x00
电话号码:
1
256
(可以用十六进制写为):
具有大端字节模式:
0x00 0x00 0x00 0x01
0x01 0x00 0x00 0x00
0x00 0x00 0x01 0x00
0x00 0x01 0x00 0x00
以及小端字节模式:
0x00 0x00 0x00 0x01
0x01 0x00 0x00 0x00
0x00 0x00 0x01 0x00
0x00 0x01 0x00 0x00
因为您的机器是小端数,所以
MemoryMarshal.Cast
使用数字的小端数表示。因此,1000
被解释为1
,0100
被解释为256
字节不是位。在小型endian机器上,字节00-01-00-00表示整数0x00000100,即256。感谢您的评论。但是现在我真的很困惑,为什么数组的前半部分1,0,0,0
的值是十进制的1
,而不是4096。我不理解canton7的答案——字节首先以最低有效位(因此也是字节)存储。01-00-00-00是整数0x00000001,即1。4096将是0-16-0-0(十进制)或0x00-0x10-0x00-00(十六进制),给出整数0x00001000。在这里,用字节思考比用位思考要好得多,因为机器也将字节视为一个单独的实体(字节中位的“顺序”基本上是不可见的,我们通常总是先写入最重要的位,而不管其是否为endianness)。在这种情况下,我的字节数组的前半部分100
将被解释为0x1000
对吗?它实际上是十进制的4096
,但是intSpan[0]
的值是1
。你能给我解释一下吗?我现在很困惑。Thanks@J我是小恩迪安。整数值1的字节0x00 0x00 0x00 0x01
以大端顺序排列,或0x01 0x00 0x00 0x00
以小端顺序排列。我现在更迷路了。为什么你将0,1,0,0
解释为0x0100
,而对于1,0,0,0
你将其解释为0x0001
?@JérômeMEVEL如果你不知道尾数是什么,请现在就仔细阅读。整数1具有十六进制值0x00000001
(可以将其缩短为0x0001
或0x01
,等等)。它的字节大端顺序为0x00 0x00 0x00 0x01
,小端顺序为0x01 0x00 0x00 0x00
。看看小端序是如何与大端序相反的?整数256
具有十六进制值0x00000100
(您可以将其缩短为0x0100
)。它的字节以大端顺序0x00 0x00 0x01 0x00
,或者以小端顺序0x00 0x01 0x00
。自从你在回答中提到endianness后,我一直在阅读有关endianness的内容,但我仍然不明白为什么在我的小端机器上intSpan[0]
的值是1
0x1000
在小型endian机器上是4096
。出于某种原因,您似乎在大端词中处理1,0,0,0
,而在小端词中处理0,1,0,0
。为什么?