c# - 理解 MemoryMarshal.Cast 的返回值
问题描述
我正在尝试了解新的 C# 类型Span<T>
在阅读 Microsoft 的文章All About Span: Exploring a New .NET MainstayWhat Is Span<T>?
时,我在该部分的底部看到
Span 提供了许多已经提到的好处之外的好处。例如,跨度支持重新解释强制转换的概念,这意味着您可以将 a 强制转换为
Span<byte>
aSpan<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
?
解决方案
号码:
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
被解释为1
,0 1 0 0
并被解释为256
。
推荐阅读
- angular - Angular - 如何正确更改选项卡单击上的动态生成视图?
- c# - 有什么方法可以使用自定义标签来忽略 Specflow 中的正确测试
- python - 相当于 kubectl get pods 的 Python Kubernetes 客户端
- jquery - RShiny:为 tabsetPanel 中具有随机生成的 ID 的 UI 项检索 jsQuery 选择器
- android - 如何在 pexels API 中的 Flutter 图像中设置壁纸
- java - 为什么我使用 setLayoutParams 时 FrameLayout 不显示?
- kotlin - 替换非空断言运算符“!!” 执行数学表达式
- java - 在按钮单击中显示加载 GIF,并在执行操作后再次隐藏它
- java - Javadoc 不会在 IntelliJ IDEA 中自动生成
- c# - 为什么 adapter.Fill 突然停止在 C# 中填充我的数据表?