Используя SQL для определения cidr значения маски подсети

Используя xml linq, я помещаю результаты в словарь, разбирая все свойства в xml

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication97
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            List<Respcondition> responses = doc.Descendants("respcondition").Select(x => new Respcondition()
            {
                _continue = (string)x.Attribute("continue"),
                varequal = (string)x.Descendants("varequal").FirstOrDefault(),
                respident = (string)x.Descendants("varequal").FirstOrDefault().Attribute("respident"),
                setvar = (string)x.Element("setvar"),
                action = (string)x.Element("setvar").Attribute("action"),
                linkrefid = (string)x.Element("displayfeedback").Attribute("linkrefid"),
                feedbacktype = (string)x.Element("displayfeedback").Attribute("feedbacktype")
            }).ToList();

            Dictionary<string, List<Respcondition>> dict = responses.GroupBy(x => x.respident, y => y)
                .ToDictionary(x => x.Key, y => y.ToList());

        }
    }
    public class Respcondition
    {
        public string _continue { get; set; }
        public string varequal { get; set; }
        public string respident { get; set; }
        public string setvar { get; set; }
        public string action { get; set; }
        public string linkrefid { get; set; }
        public string feedbacktype { get; set; }
    }


}

 //<respcondition continue="Yes">
 //   <conditionvar>
 //     <varequal respident="gap_0">auswahl1</varequal>
 //   </conditionvar>
 //   <setvar action="Add">1</setvar>
 //   <displayfeedback linkrefid="0_Response_0" feedbacktype="Response"/>
 // </respcondition>
11
задан Steven A. Lowe 11 November 2008 в 03:05
поделиться

2 ответа

Я думаю, что нашел решение своей проблемы. Вот то, что я сделал:

select CONCAT(INET_NTOA(ip_addr),'/',32-log2((4294967296-ip_mask))) net 
from subnets 
order by ip_addr

В основном я беру свою decmial маску и вычитаю ее из максимального десятичного значения. Я затем к log2 на том значении для получения значения логарифма. Затем просто вычтите это от 32 (максимальный доступный бит).

Надежда, которая помогает другим.

Спасибо

8
ответ дан 3 December 2019 в 09:42
поделиться

SQL-запросы не имеют процедурной конструкции цикличного выполнения (несмотря на процедурный язык), но можно сравнить один набор строк к другому набору строк, который отчасти похож на цикл.

У Вас только есть 32 возможных маски подсети. В случаях как это имеет смысл составлять маленькую таблицу, которая хранит эти 32 маски и связанное число CIDR.

CREATE TABLE cidr (
  bits INT UNSIGNED PRIMARY KEY,
  mask INT UNSIGNED NOT NULL
);

INSERT INTO cidr (bits) VALUES
  ( 1), ( 2), ( 3), ( 4), ( 5), ( 6), ( 7), ( 8), ( 9), (10),
  (11), (12), (13), (14), (15), (16), (17), (18), (19), (20),
  (21), (22), (23), (24), (25), (26), (27), (28), (29), (30),
  (31), (32);

UPDATE cidr SET mask = ((POWER(2,32)-1)<<(32-bits)) & (POWER(2,32)-1);

SELECT CONCAT(s.ip_addr, '/', c.bits)
FROM cidr c JOIN subnets s ON (c.mask = inet_aton(s.ip_mask));
2
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: