C# 如何将4个字节合并为32位无符号整数?

C# 如何将4个字节合并为32位无符号整数?,c#,bit-manipulation,C#,Bit Manipulation,我正在尝试将4个字节转换为32位无符号整数 我想可能是这样的: UInt32 combined = (UInt32)((map[i] << 32) | (map[i+1] << 24) | (map[i+2] << 16) | (map[i+3] << 8)); UInt32 combined=(UInt32)((map[i]使用该类 具体来说,你的班次都是8档。24、16、8和0档。 您始终可以执行以下操作: public static uns

我正在尝试将4个字节转换为32位无符号整数

我想可能是这样的:

UInt32 combined = (UInt32)((map[i] << 32) | (map[i+1] << 24) | (map[i+2] << 16) | (map[i+3] << 8));
UInt32 combined=(UInt32)((map[i]使用该类


具体来说,

你的班次都是8档。24、16、8和0档。

您始终可以执行以下操作:

public static unsafe int ToInt32(byte[] value, int startIndex)
{
    fixed (byte* numRef = &(value[startIndex]))
    {
        if ((startIndex % 4) == 0)
        {
            return *(((int*)numRef));
        }
        if (IsLittleEndian)
        {
            return (((numRef[0] | (numRef[1] << 8)) | (numRef[2] << 0x10)) | (numRef[3] << 0x18));
        }
        return ((((numRef[0] << 0x18) | (numRef[1] << 0x10)) | (numRef[2] << 8)) | numRef[3]);
    }
}
公共静态不安全int-ToInt32(字节[]值,int-startIndex)
{
固定(字节*numRef=&(值[startIndex]))
{
如果((起始索引%4)=0)
{
返回*((int*)numRef));
}
如果(IsLittleEndian)
{

返回(((numRef[0]|)(numRef[1]假设你选择坚持数学而不是委托,是的。@Ignacio,让我困惑的是,我移动一个字节的位置比它移动的位置多。那么,为什么移动一个字节24个位置有效呢?在所有移动之后,它才被转换为32位整数。字节的值占据位1到8。你想将它移动24位以使它保持不变吗占用第24位到第32位。如果将If移位为32位,它将从末尾消失。编译器知道这一点。但它仍然以32位执行操作,而不管左操作数的大小。@Ignacio,我能了解一下编译器使用32位执行这些操作的行为吗,即使所操作的类型小于t那是什么?我只是想弄明白它的意思。而且..你之所以会在手动移位时使用它,是因为如果我的C#代码在一个体系结构上被编译成不同的endianess,那么它仍然可以工作?@Pocki:不,位移位总是以同样的方式工作,不管实际字节本身存储在内存中的顺序是什么。
将位移位为“更低”。@Pocki:是的,转换是特定于endian的。类使用一个特定于系统的标志来调整转换。相关代码如下所示:
if(IsLittleEndian){return((numRef[0]|(numRef[1]