【问题标题】:Binary string to int and then a BitWise AND二进制字符串到 int,然后是 BitWise AND
【发布时间】:2017-07-28 20:20:53
【问题描述】:

我正在尝试制作一个小程序,我可以在其中输入 IPv4 地址和 SubMask 地址。

工作正常...

然后我会做一个 AND,所以我可以看到 IPv4 地址来自哪个子网络,以(二进制形式)... 我不能让它工作,有人可以帮忙..

这里我试图将按位字符串转换为 Int,所以我可以进行和 AND,但是我的变量 iSIDs 和 iSIDr(int 数据类型)没有得到值..

变量子结果和结果是 32 位二进制形式的十进制 IPv4 转换地址,因此 BitWise 字符串...

        string SIDsubresult = subresult;
        SIDsubresult = SIDsubresult.Replace(".", "");
        string SIDresult = result;
        SIDresult = SIDresult.Replace(".", "");
        int iSIDs = Convert.ToInt32(SIDsubresult);
        int iSIDr = Convert.ToInt32(SIDresult);
        Console.Write(iSIDr & iSIDs);

编辑/更新

在我开始编写代码之前,所有人都有代码.. 我之前的代码和代码在这里

        var split = (from p in ipv4add.Split('.') select int.Parse(p)).ToArray();
        string result = string.Format("{0}.{1}.{2}.{3}",
            Convert.ToString(split[0], 2).PadLeft(8, '0'),
            Convert.ToString(split[1], 2).PadLeft(8, '0'),
            Convert.ToString(split[2], 2).PadLeft(8, '0'),
            Convert.ToString(split[3], 2).PadLeft(8, '0'));

        var subsplit = (from s in subnetmaske.Split('.') select int.Parse(s)).ToArray();
        string subresult = string.Format("{0}.{1}.{2}.{3}",
            Convert.ToString(subsplit[0], 2).PadLeft(8, '0'),
            Convert.ToString(subsplit[1], 2).PadLeft(8, '0'),
            Convert.ToString(subsplit[2], 2).PadLeft(8, '0'),
            Convert.ToString(subsplit[3], 2).PadLeft(8, '0'));

        string SIDsubresult = subresult;
        SIDsubresult = SIDsubresult.Replace(".", "");
        string SIDresult = result;
        SIDresult = SIDresult.Replace(".", "");
        int iSIDs = Convert.ToInt32(SIDsubresult);
        int iSIDr = Convert.ToInt32(SIDresult);
        Console.Write(iSIDr & iSIDs);

【问题讨论】:

  • 通过解析不带句点将 IPv4 地址转换为 int 是非常错误的并且通常会溢出
  • 查看例如stackoverflow.com/questions/1499269/…,了解如何检查子网的 IP
  • 使用 uint 而不是 int。 IPV4 最大值可以是 0xFFFFFFFF,这会溢出 int,但不会溢出 uint。

标签: c# bitwise-and


【解决方案1】:

我试过这个并为我工作:

 var sidsub = SIDsubresult.Split('.');
        var sid = SIDresult.Split('.');

        var result = "";
        for (int i = 0; i < sidsub.Length; i++)
        {
            result += (int.Parse(sidsub[i]) & int.Parse(sid[i]));
            if (i + 1 != sidsub.Length) result += ".";
        }

【讨论】:

    【解决方案2】:

    这是因为 int max 有 9 个数字长度并且您的 ip add 更长 尝试使用 long:

    string SIDsubresult = subresult;
        SIDsubresult = SIDsubresult.Replace(".", "");
        string SIDresult = result;
        SIDresult = SIDresult.Replace(".", "");
        long iSIDs = Convert.ToInt64(SIDsubresult);
        long iSIDr = Convert.ToInt64(SIDresult);
        Console.Write(iSIDr & iSIDs);
    

    【讨论】:

    • 虽然还是真的错了,溢出不是主要问题,但对于前。 “1.1.1.1”必须解析为 0x01010101 而不是(十进制)1111(又名 0x457,因为它看起来像随机垃圾)。
    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2015-11-21
    相关资源
    最近更新 更多