字节数组中的右移

时间:2016-12-19 11:16:25

标签: c# .net

我有两个8位的十六进制字符串。我需要对这两个十六进制字符串应用和操作,然后将右移应用于7位并获得十进制值。我已经尝试将十六进制字符串转换为长度为4的字节数组(8 * 2 = 32位= 4字节)并且做了&以相同的顺序对单个字节进行操作,将结果保存到另一个长度为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

在data1Bytes,data2Bytes之间的AND操作,它给出输出:bytearray1 [0,0,48,0](这些0000-0000 0000-0000 0011-0000 0000-0000的位和十进制值是12,288)。

直到此步骤,我的所有转换和计算都按预期工作。 现在我需要右移这个最终结果的7位,这应该给0000-0000 0000-0000 0000-0000 0110-0000(十进制值为96)。

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

 var res = BitConverter.ToInt32(bytearray1, 0);
 var shift = res >> 7;

但是res = 3145728(应该是12,228)并且shift = 24,576(应该是96)

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

var bitArray = new BitArray(bytearray1);

bitArray [0] ... bitArray [19] = false,bitArray [20] = bitArray [21] = true,bitArray [22] ... bitArray [31] = false。

bitArray [0] ----------- [31]:0000 0000 0000 0000 0000 1100 0000 0000,

将此结果改为错误值。 请帮帮我,我缺少什么?

2 个答案:

答案 0 :(得分:0)

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

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

uint data1 = 0x40003019;
uint data2 = 0x00FFFF80;

现在只需和他们在一起,然后右移结果:

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

这会得到96的结果。

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

uint data1 = uint.Parse(str.Substring(2), NumberStyles.HexNumber);

str.SubString(2)只是为了剥离"0x"前缀。如果输入字符串没有"0x"前缀,则这是不必要的。

答案 1 :(得分:-2)

请尝试以下操作:

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();
        }
    }


}