我正在研究一些采用十六进制字符串输入并生成该输入的二进制值的代码。一旦我有了二进制十六进制字符串的值,我就需要访问该字节的各个位。
我不能准确地说出我在做什么,但我可以这样说:十六进制字符表示某些硬件上给定寄存器选择的字节值 - 它为我们提供了十六进制字符串,因为它在完成运算后输出一些数字。
作为一个虚构的例子,输出值“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;
}
}
对此的任何帮助将不胜感激。