0

我正在研究一些采用十六进制字符串输入并生成该输入的二进制值的代码。一旦我有了二进制十六进制字符串的值,我就需要访问该字节的各个位。

我不能准确地说出我在做什么,但我可以这样说:十六进制字符表示某些硬件上给定寄存器选择的字节值 - 它为我们提供了十六进制字符串,因为它在完成运算后输出一些数字。

作为一个虚构的例子,输出值“A2”(10100010)将意味着寄存器(再次虚构)将具有以下值:

RegA  RegB  RegC  RegD
 101     0   001     0

我需要访问返回的字节值中的 N 个位数。除了我在路上遇到了一个颠簸。

到目前为止,我已经尝试了以下方法:

string inputString = "F";
byte[] byteValues = new byte[inputString.Length * sizeof(char)];
System.Buffer.BlockCopy(inputString.ToCharArray(), 0, byteValues,
                        0, byteValues.Length);
return byteValues;

但是,当给定输入字符串“F”时,此代码返回一个包含 4 个元素的字节数组。第一个元素的值为 70,其余的值为 0。这是大写 F 的 ASCII 键 - 不是我想要的。

我也试过:

int tempInt = Convert.ToInt32("F", 16);
byte[] value = BitConverter.GetBytes(tempInt);

当给定输入字符串“F”时,此代码返回一个包含 4 个元素的字节数组。第一个元素的值为 15,其余的值为 0。这更像是它,但我现在需要访问字节数组的第一个元素中的各个位。

除了提供一种将十六进制字符输入的方法,打开它并返回一个具有该十六进制字符正确位值的 4 元素字节 [] 之外,是否有一种编程方式来获取单个位信息?

这就是我的意思:

public byte[] getByteValueForString (string inputString)
{
  /* is there a better way than this? */
  switch(inputString)
  {
     case "0":
       return new byte[] {0, 0, 0, 0};
     //....
     case "E":
       return new byte[] {1, 1, 1, 0};
     case "F":
       return new byte[] {1, 1, 1, 1};
  }
}

//or a similar method that switches on the output
//of Convert.ToInt32(string, 16) and returns the a
//byte[] in the same manner as getByteValueForString

public bool bar ()
{
  /* check the value for some representation
   * of a register */
  if (fooByteArray[2] == 0 & fooByteArray[3] == 0)
  {
    //some register, on the remote machine, is set to false
    return false;
  }
}

对此的任何帮助将不胜感激。

4

2 回答 2

2

个人只为此使用一个字节,而不是将 4 位拆分为 4 个字节。那时你可以使用:

byte b = Convert.ToByte(text, 16);

如果你真的想要 4 个字节,你可以使用:

// Note: name changed to comply with .NET conventions
static byte[] GetByteValuesForString(string text)
{
    // TODO: Consider what you want to happen for invalid input.
    // You can easily write your own equivalent, ideally for a
    // single char
    byte value = Convert.ToByte(text, 16);
    return new byte[] {
        (byte) (value >> 3) & 1, 
        (byte) (value >> 2) & 1,
        (byte) (value >> 1) & 1,
        (byte) (value >> 0) & 1
    };
}
于 2012-06-20T16:25:42.283 回答
1

我使用 4 个字节来表示 4 位的唯一原因是因为我无法确定使用哪个对象来表示各个位。

看看System.Collection.BitArray类。

 byte[] byteArray = new byte[yourString.Length / 2];
 for(int i = 0; i < byteArray.Length; ++i)  
 { 
     int tempInt1 = Convert.ToInt32(yourString[i], 16); 
     int tempInt2 = Convert.ToInt32(yourString[i + 1], 16);
     byteArray[i] = (byte)(tempInt1 << 4 + tempInt2);
 }

BitArray bits = new BitArray(byteArray);
for (int i = 0; i = bits.Count; ++i)
{
   Console.WriteLine(bits[i]);
}
于 2012-06-20T16:26:08.783 回答