0

私は、16進文字列入力を受け取り、その入力のバイナリ値を生成するコードに取り組んでいます。16進文字列の値をバイナリで取得したら、そのバイトの個々のビットにアクセスする必要があります。

私が取り組んでいることを正確に言うことはできませんが、私はこれを言うことができます:16進文字は、いくつかのハードウェア上のレジスタの特定の選択のバイト値を表します-これは、いくつかのクランチが終了した後の出力として16進文字列を提供します数字。

構成された例として、出力値 "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つの要素を持つバイト配列を返します。1番目の要素の値は15で、残りの要素は0です。これはもっと似ていますが、バイト配列のこの1番目の要素内の個々のビットにアクセスする必要があります。

16進文字を受け取り、それをオンにして、その16進文字の正しいビット値を持つ4要素byte []を返すメソッドを提供する以外に、個々のビット情報を取得するプログラム的な方法はありますか?

これは私が意味することです:

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バイトに分割するのではなく、1バイトを使用します。その時点で、次を使用できます。

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 に答える