Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#.net中,将一系列位转换为整数值的传统方法是什么?_C#_.net_Hex_Byte_Bitarray - Fatal编程技术网

在c#.net中,将一系列位转换为整数值的传统方法是什么?

在c#.net中,将一系列位转换为整数值的传统方法是什么?,c#,.net,hex,byte,bitarray,C#,.net,Hex,Byte,Bitarray,我已经编写了很多年的程序,但直到现在,我还从未需要过多地使用逐位运算,或者在位甚至字节级别上过多地处理数据。所以,请原谅我缺乏知识 我必须处理通过套接字通信获得的流式消息帧数据。消息帧是一系列十六进制字节编码的Big-Endian,我将其读入一个名为byteArray的字节数组。以以下2个字节为例: 0x03 0x20 我需要的数据在前14位表示,这意味着我需要将前14位转换为int值。(最后2位表示另外2个布尔值)。为此,我编写了以下代码: if (BitConverter.IsLittleE

我已经编写了很多年的程序,但直到现在,我还从未需要过多地使用逐位运算,或者在位甚至字节级别上过多地处理数据。所以,请原谅我缺乏知识

我必须处理通过套接字通信获得的流式消息帧数据。消息帧是一系列十六进制字节编码的Big-Endian,我将其读入一个名为byteArray的字节数组。以以下2个字节为例:

0x03 0x20

我需要的数据在前14位表示,这意味着我需要将前14位转换为int值。(最后2位表示另外2个布尔值)。为此,我编写了以下代码:

if (BitConverter.IsLittleEndian)
{
    Array.Reverse(byteArray);
}

BitArray bitArray = GetBitArrayFromRange(new BitArray(byteArray), 0, 14);

int dataValue = GetIntFromBitArray(bitArray)
dataValue变量以正确的结果结束,即:800

我调用的两个函数如下:

    private static BitArray GetBitArrayFromRange(BitArray bitArray, int startIndex, int length)
    {
        var newBitArray = new BitArray(length);

        for (int i = startIndex; i < length; i++)
        {
            newBitArray[i] = bitArray.Get(i);
        }

        return newBitArray;
    }

    private static int GetIntFromBitArray(BitArray bitArray)
    {
        int[] array = new int[1];

        bitArray.CopyTo(array, 0);

        return array[0];
    }
私有静态位数组GetBitArrayFromRange(位数组位数组,int startIndex,int length)
{
var newBitArray=新的位数组(长度);
对于(int i=startIndex;i
由于我在这方面缺乏经验,我的问题是:这段代码看起来正确/合理吗?或者,是否有一种更为理想/传统的方式来实现我的需求

谢谢

“dataValue变量以正确的结果结束,即:800

正确的结果不应该是200吗

1) 000000 11 00100001:是整数
0x0321
(因此现在跳过开头两位
01

2) xx000000 11001000:提取最后14位(缺少2位,因此那些
xx
计为零)

3) 00000000 11001000:是14位提取的预期最终结果=200

目前,看起来您有一个空(零填充)16位,您将14位放入其中。不知何故,你把它放在了完全相同的位置(左手边而不是右手边)

您的右侧
XX
为零,因此您的结果为000000 11 00100000,这将给出800,但这是错误的,因为它不是您提取的特定14位的真实值

“是否有一种更受欢迎/传统的方式来完成我的任务 需要什么?”

我猜位转移是传统的方式

解决方案(伪代码):

通过向右轻推所有2个位置/插槽,您可以看到最左边的两个现在为空的位置如何变成XX(在更改它们之前自动归零),并且通过轻推,您还删除了想要忽略的(右侧)2位。。。给您留下正确的14位值

PS:
关于你的代码。。。我还没有机会全部测试它,但下面的逻辑似乎更适合您的
GetBitArrayFromRange
函数:

for (int i = 0; i < (length-1); i++)
{
    newBitArray[i] = bitArray.Get(startIndex + i);
}
for(int i=0;i<(length-1);i++)
{
newBitArray[i]=bitArray.Get(startIndex+i);
}

抱歉,我在调用GetBitArrayFromRange时出错,我传入的startIndex是2,而不是0。这应该可以解释为什么我得到了正确的值800(而不是你提到的200)。我已经更正了上面的帖子。我已经用许多有价值的场景测试了我的代码,并用我的代码验证了所有结果都是正确的。所以,这告诉我,从逻辑上讲,这是正确的,然而,我只是想知道是否有更好的更传统的方法。您的位移位示例似乎没有给出正确的结果。您是说14位
000000 11 001000
(本质上是
11 001000
)为您提供800???你在用什么计算器应用程序检查这个?我想自己测试一下(Windows)。例如,试着用十六进制输入您的
0321
,现在您看到16位(因为$0001仍然是1美元,所以前导零总是隐藏的),所以删除前2位(从右侧删除!!),剩下的十进制值是多少?还要检查十进制200与十进制800PS的位差:“您的位移位示例似乎没有给出正确的结果”当然没有,为什么要这样做?您认为
0x0321
的16位值包含14位,表示为800,那么为什么要这样做呢?。实际上,你只需要10位就可以保存800,而不管
startIndex
2
还是
0
我告诉你,没有任何10位(甚至14位)可以按顺序从以下位生成800:
0x0321
(即使改变尾数也不行)…只需用计算器仔细检查所有内容,并在每次更改前后跟踪位的输出,以便更容易地看到哪里出错。很抱歉,我又一次输入错误,但出于某种原因,so不允许我编辑我的帖子。。。我使用两个值进行测试:0x0320和0x321。我的0x321测试的正确结果实际上是:801。0x0320的正确结果为800。虽然上面的代码确实有效,但我最终还是找到了我在这里寻找的位移位/位掩码答案:-使用提供的代码并将0x810E换成0x0320,您将得到:800。还有,使用:还有,你提出200的原因是因为你从左到右阅读。从右向左读取二进制文件,请参见:
var myShort = 0x0321; //Short means 2 bytes
var answer = (myShort >> 2); //bitshift to right-hand side by 2 places
for (int i = 0; i < (length-1); i++)
{
    newBitArray[i] = bitArray.Get(startIndex + i);
}