Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 字节数组中的右移_C#_.net - Fatal编程技术网

C# 字节数组中的右移

C# 字节数组中的右移,c#,.net,C#,.net,我有两个8位数的十六进制字符串。我需要对这两个十六进制字符串应用and运算,然后对7位应用右移,得到十进制值。我尝试将十六进制字符串转换为长度为4 8*2=32位=4字节的字节数组,并按相同顺序对各个字节执行了操作(&O),将结果保存到另一个长度为4的byre数组。如何将位移位到此字节数组 Ex : data1 in hex: 0x40003019, data1 in bits: 0100-0000 0000-0000 0011-0000 0001-1001, data1

我有两个8位数的十六进制字符串。我需要对这两个十六进制字符串应用and运算,然后对7位应用右移,得到十进制值。我尝试将十六进制字符串转换为长度为4 8*2=32位=4字节的字节数组,并按相同顺序对各个字节执行了操作(&O),将结果保存到另一个长度为4的byre数组。如何将位移位到此字节数组

Ex : data1 in hex: 0x40003019,  
     data1 in bits: 0100-0000 0000-0000 0011-0000 0001-1001,
     data1 in bytes:    64   0  48  25,
     data2 in hex: 0x00FFFF80,
     data2 in bits : 0000-0000 1111-1111 1111-1111 1000-0000,
     data2 in bytes :  0 255 255 128
和Data1字节之间的运算,Data2字节输出:这些0000-0000-0000 0011-0000-0000的bytearray1[0,0,48,0]位和十进制值为12288

直到这一步,我所有的转换和计算都按预期进行。 现在我需要将这个最终结果的7位右移,它应该给出96的0000-0000-0000-0000-0000 0110-0000十进制值

1我已尝试将字节数组转换为int并应用右移

 var res = BitConverter.ToInt32(bytearray1, 0);
 var shift = res >> 7;
但是res=3145728应该是12228,shift=24576应该是96

2我已经厌倦了将bytearray1[0,0,48,0]转换为位数组,但结果位数组中的位顺序相反

var bitArray = new BitArray(bytearray1);
bitArray[0]…bitArray[19]=false,bitArray[20]=bitArray[21]=true,bitArray[22]…bitArray[31]=false

位数组[0]----[31]:0000 0000 11000000

位移动此结果错误的值。 请帮帮我,我缺少什么

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication33
{

    class Program
    {

        static void Main(string[] args)
        {
            List<string> digits = new List<string>() {
                                  "0000","0001","0010","0011","0100","0101","0110","0111",
                                  "1000","1001","1010","1011","1100","1101","1110","1111"
                              };
            string input = "0100-0000 0000-0000 0011-0000 0001-1001";
            byte[] bytes = input.Split(new char[] { '-', ' ' }).Select(x => (byte)digits.IndexOf(x)).ToArray();
            ulong number = BitConverter.ToUInt64(bytes,0);
            Console.WriteLine(number);
            Console.ReadLine();
        }
    }


}

我不知道为什么这对你不起作用,但当我尝试它时,显而易见的方法是有效的

首先假设uint值中有两个十六进制数:

现在将它们放在一起,然后右移结果:

uint anded  = data1 & data2;
uint result = anded >> 7; // Gives 96 as requested.
结果是96

如果您的输入是字符串str=0x40003019形式的字符串;您可以将其转换为uint,如下所示:


str.SubString2只是为了去掉0x前缀。如果输入字符串没有0x前缀,则不需要这样做

你说的是右移,但你的例子是从00110000向左移动到01100000。哪个是正确的?也许您只需要将>>替换为@MatthewWatson hi,如果您看到的是最后一个位表示,我刚刚展示了将bytearray1转换为bitArray后存储在位数组中的位。在字节之间进行and运算后,我需要右移我的最终结果。嗯,但你说现在我需要右移这个最终结果的7位,应该得到0000-0000-0000-0000**0110-0000**,考虑到上一步有0000-0000-0000**0011-0000**0000-0000,是一个左移位。啊,我想我明白你现在在做什么了——它是跨多个字节的移位。@MatthewWatson是的。你是对的,这是一个4字节的转换。你认为有7k代表的人现在能够正确地格式化他们的代码了吗?这也完全不能满足OP的要求。在任何情况下,你们都并没有进行位移位吗?是的,使用位转换器。嗨,是的,我也用和你们一样的方法做了,并且得到了结果。谢谢你的帮助。
uint anded  = data1 & data2;
uint result = anded >> 7; // Gives 96 as requested.
uint data1 = uint.Parse(str.Substring(2), NumberStyles.HexNumber);