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