以二进制形式修改十六进制

时间:2014-07-22 17:11:58

标签: c# .net binary hex

我希望能够将十六进制字节转换为8位二进制字符串或位数组,修改字符串中的单个位并转换回十六进制字节。

理论上我会得到

的输入
 "FF"

将其转换为二进制并更改其中一个位

 "11111111" => "11110111"

并将其转换回来

 "F7"

我无法使Convert.ToInt32()正常工作,格式(“X2”)也无法正常工作。 有什么想法吗?

private void changeDObit(int port, int bitNum, int state)
    {
        try
        {
            byte currentstate;
            instantDoCtrl1.Read(port, out currentstate);
            string data0Hex = currentstate.ToString("X2");
            string data0Binary = Convert.ToString(Convert.ToInt32(data0Hex, 16), 2).PadLeft(data0Hex.Length * 4, '0');

            if (!data0Binary[bitNum].Equals(state))
            {
                StringBuilder sb = new StringBuilder(data0Binary);
                sb[bitNum] = (char)state;
                data0Binary = sb.ToString();
                string strHex = string.Format("{0:X2}", sb);
                byte outdata = Convert.ToByte(strHex);
                instantDoCtrl1.Write(port, outdata);
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());

        }

    }

1 个答案:

答案 0 :(得分:2)

这是您整个方法的简单版本:

private void changeDObit(int port, int bitNum, int state)
{
    byte currentstate;
    instantDoCtrl1.Read(port, out currentstate);
    var bitValue = 1 << bitNum;
    currentstate = (currentstate & ~bitValue) | (state * bitValue);
    instantDoCtrl1.Write(port, outdata);
}

假设:

  • bitNum = 0..7其中0是最右边的位,1位于左边,等等。
  • state为0或1

它的工作方式如下:

当你将两个数字一起按位时,你实际上最终得到了两者中所有的1位。

所以,表达式的第一部分:

(currentstate & ~bitValue)

一起currentstate~bitValue

那么,~bitValue是什么?好吧,在这种情况下,bitValue设置为1位,因此它的二进制值为00000001,00000010,00000100,00001000,00010000,00100000,010000或10000000。

~ 反转,将所有1&n转换为0,反之亦然。实际上,您正在使用11111110,11111101,111111011,11110111,111101111,11011111,10111111或01111111进行currentstate,保留所有其他位,但清除一位。

然后,表达式的第二部分:

| (state * bitValue)

这里我们将state乘以bitValue乘以state,从上面乘以相同的7-zeroes-and-1-bit-set值,结果为 进入最终结果。实际上,如果state为1,我们会设置位,否则我们不会。

因此,表达式如下:

  • 首先确保清除有趣位
  • 然后可选地(如果{{1}}为1),设置它