首页 > 解决方案 > 将 3 个字节 Span 转换为 int 的正确方法

问题描述

我知道,我可以Span通过分别转换每个字节并组合成一个整数来将 3 个字节转换为字节数组。我还可以将 1 字节数组与从类转换Span并使用的 3 字节数组连接起来BitConverter。这些方法很古老而且众所周知,但我正在考虑是否有更好的方法来做到这一点,尤其是在Span像这样使用时:mySpan.Slice(10, 3).

标签: c#

解决方案


问题是 3 字节是一个非常尴尬的数字,因为没有可用的 3 字节寄存器大小。一种方法是将其拆分为 2 个字节和 1 个字节,并将|它们放在一起:

var arr = new byte[] { 5, 20, 10 };
var span = arr.AsSpan();

var val = MemoryMarshal.Cast<byte, ushort>(span.Slice(1))[0] << 16 | (span[0] << 8);

JIT 生成的汇编代码只是像预期的那样直接复制 ( lea) 和移位 ( shr),只是 C# 语法有点笨拙。


推荐阅读