C# 使用bitarray获取位并构建新值

C# 使用bitarray获取位并构建新值,c#,bitarray,C#,Bitarray,如果我取一个uint值=2921803(0x2C954B),它实际上是一个4字节的包(4B 95 2C00) 我想用bitarray得到字节版本的16个最低有效位,我该怎么做呢 这就是我试图做到的: byte[] bytes = BitConverter.GetBytes(value); //4B 95 2C 00 - bytes are moved around BitArray bitArray = new BitArray(bytes); //entry [0] shows value

如果我取一个uint值=2921803(0x2C954B),它实际上是一个4字节的包(4B 95 2C00) 我想用bitarray得到字节版本的16个最低有效位,我该怎么做呢

这就是我试图做到的:

byte[] bytes = BitConverter.GetBytes(value);  //4B 95 2C 00  - bytes are moved around
BitArray bitArray = new BitArray(bytes); //entry [0] shows value for 1101 0010 (bits are reversed)
在这一点上,我完全改变了主意。我确实试过:

byte[] bytes = BitConverter.GetBytes(value);

Array.Reverse(bytes);
BitArray bitArray = new BitArray(bytes);
这给了我所有的位,但完全颠倒,从[31]读到[0]。 最终,我期待/希望得到19349(4B 95)作为我的答案

这就是我希望实现该功能的方式:

private uint GetValue(uint value, int bitsToGrab, int bitsToMoveOver)
{
    byte[] bytes = BitConverter.GetBytes(value);
    BitArray bitArray = new BitArray(bytes);

    uint outputMask = (uint)(1 << (bitsToGrab - 1));
    //now that i have all the bits, i can offset, and grab the ones i want
    for (int i = bitsToMoveOver; i < bitsToGrab; i++)
    {
        if ((Convert.ToByte(bitArray[i]) & 1) > 0)
        {
            outputVal |= outputMask;
        }

        outputMask >>= 1;
   }

}
private uint-GetValue(uint-value、int-bitsToGrab、int-bitsToMoveOver)
{
字节[]字节=位转换器.GetBytes(值);
BitArray BitArray=新的BitArray(字节);
uint输出掩码=(uint)(10)
{
outputVal |=输出掩码;
}
输出掩码>>=1;
}
}

0x2C954B
的16个最低有效位是
0x954B
。您可以通过以下方式获得:

int value = 0x2C954B;

int result = value & 0xFFFF;
// result == 0x954B
int result = ((value & 0xFF) << 8) | ((value >> 8) & 0xFF);
// result == 0x4B95
如果需要
0x4B95
,则可以按如下方式获得:

int value = 0x2C954B;

int result = value & 0xFFFF;
// result == 0x954B
int result = ((value & 0xFF) << 8) | ((value >> 8) & 0xFF);
// result == 0x4B95

int提取(int值、int偏移量、int长度)
{
返回值(值>>偏移量)和((1>24)和0xFF)|((值>>8)和0xFF00)|
((值&0xFF00)单位-32位
基本上,您应该将16个最高有效位设置为零,因此使用按位
运算符:

uint newValue = 0x0000FFFF & uintValue;

你想从0x2C954B中获取0x4B95吗?这是我最终的想法。如果有人想改进它,我欢迎。我更新了我的问题陈述。数据作为uint提供给我,但实际上是4个字节。基本上,我有一个作为uint传递给我的长数据流,我需要从该str中获取数据块eam(这里8位,那里24位,等等)。我上面列出的结果是基于我的输入数据的正确结果,我只是尝试将位设置正确。按位或
不会将16个最高有效位设置为零。
0x0000FFFF | 0x2C954B
导致
0x2CFFFF
。您是指按位和
&
?这是可行的,但主要问题是函数必须是可修改的。我的意思是,我需要知道从开始偏移多少位,需要获取多少位。我也不能保证它们最终会在8位边界上。(4B95结果就是我需要的结果)@Jason:请用这些细节更新一个问题,如果你能提供你所期望的方法签名,或者更详细地描述你所期望的灵活性,那就太好了need@Jason:dtb使用的方法比使用位数组快得多,更重要的是,您有机会了解按位操作better@dtb-这更接近,但偏移量需要为0。原因是,虽然我的数据以UINT的形式显示,但它们实际上是字节,因此当我执行bitconverter.GetBytes时,它们按我希望获得它们的顺序排列(即,最左边的16位是我想要的)@sllev-我非常了解按位的内容。我可以阅读和理解dtb在做什么,我自己就是想不出来。以前当我做这种事情时,我们交换了字节,所以我认为这是我在这里缺少的一个主要组成部分。