Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解MemoryMarshal.Cast的返回值_C#_Arrays_Marshalling - Fatal编程技术网

C# 了解MemoryMarshal.Cast的返回值

C# 了解MemoryMarshal.Cast的返回值,c#,arrays,marshalling,C#,Arrays,Marshalling,我试图理解新的C#typeSpan 在阅读微软的文章时,我看到了什么是Span?部分的底部 跨度提供了许多超出前面提到的好处。例如,Span支持重新解释强制转换的概念,这意味着您可以将Span强制转换为Span(其中Span的第0个索引映射到Span的前四个字节)。这样,如果您读取一个字节缓冲区,就可以将它传递给安全有效地将分组字节作为int进行操作的方法 本文中没有提供任何示例,但我最终通过使用MemoryMarshal.Cast方法找到了实现这一点的(新方法) 然而,当我尝试这样做时,我得到

我试图理解新的C#type
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
。为什么?