首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >修改二进制形式的十六进制

修改二进制形式的十六进制
EN

Stack Overflow用户
提问于 2014-07-22 17:11:57
回答 1查看 252关注 0票数 0

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

从理论上讲,我的输入是

代码语言:javascript
运行
复制
 "FF"

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

代码语言:javascript
运行
复制
 "11111111" => "11110111"

然后把它转换回来

代码语言:javascript
运行
复制
 "F7"

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

代码语言:javascript
运行
复制
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());

        }

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-22 17:24:53

下面是整个方法的一个简单的版本:

代码语言:javascript
运行
复制
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是左边的,等等。
  • 状态为0或1。

其工作方式如下:

当你和两个数字按位排列在一起时,你实际上得到了两个数字中的1的所有位数。

因此,表达式的第一部分:

代码语言:javascript
运行
复制
(currentstate & ~bitValue)

currentstate~bitValue在一起。

那么,什么是~bitValue?在这种情况下,bitValue是1位集合,所以它的二进制值为00000001,00000010,00000100,00001000,00010000,00100000,01000000或10000000。

~反过来,把所有的1变成0,反之亦然。实际上,您使用的是11111110、11111101、11111011、11110111、11101111、11011111、101111或01111111,保留了所有其他位元,但清除了一个位。

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

代码语言:javascript
运行
复制
| (state * bitValue)

在这里,我们将state (0或1 )与bitValue相乘,从上面得到相同的7-0和1位设置值,并将结果合并到最终结果中。实际上,如果state为1,则设置位,否则不设置。

因此,该表达式如下:

  • 首先,确保清除了有趣的位。
  • 然后可选地(如果state是1),设置它
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24893640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档