【问题标题】:right shift in byte array字节数组右移
【发布时间】:2017-05-04 10:26:13
【问题描述】:

我有两个 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,

位移这个结果错误的值。 请帮我解决这个问题,我错过了什么?

【问题讨论】:

  • 您说“右移”,但您的示例左移从 00110000 到 01100000。哪个是正确的?也许您只需要将>> 替换为<<...
  • @MatthewWatson 嗨,如果您看到最后一位表示,我刚刚展示了将 bytearray1 转换为 bitArray 后存储在位数组中的位。在字节之间执行和操作之后,我需要右移我的最终结果。
  • 嗯,但你说now I need to right shift 7 bits of this end result which should give 0000-0000 0000-0000 0000-0000 **0110-0000**,鉴于上一步有0000-0000 0000-0000 **0011-0000** 0000-0000,是左移。
  • 啊,我想我明白你现在在做什么了——这是跨多个字节的转换。
  • @MatthewWatson 是的。你是对的,它跨越 4 个字节

标签: c# .net


【解决方案1】:

尝试以下:

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


}

【讨论】:

  • 您认为拥有 7k 代表的人现在应该能够正确格式化他们的代码吗?
  • 这也完全不符合 OP 的要求。你在任何时候都没有执行位移吗?
  • 是的,使用 BitConverter。
【解决方案2】:

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

首先假设您在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" 前缀,则这是不必要的。

【讨论】:

  • 嗨,是的,我也以与​​您相同的方式进行了操作并获得了结果。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
相关资源
最近更新 更多