Excel VBA, чтобы найти правильную формулу, чтобы получить результат из hexcode - PullRequest
0 голосов
/ 22 ноября 2018

Различные модифицированные версии алгоритмов распределения, используемые разными странами для распределения 24-битных адресов ИКАО на основе регистрации воздушного судна. Они были разработаны путем анализа схем распределения и обратной работы к алгоритму, который генерирует этот шаблон, точечноепроверка самолета, чтобы увидеть, работает ли он.YMMV.

    registration_from_hexid = (function () {
    // hide the guts in a closure

    var limited_alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ"; // 24 chars; no I,O
    var full_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";  // 26 chars



  // handles 3-letter suffixes assigned with a regular pattern
  //
  // start: first hexid of range
  // s1: major stride (interval between different first letters)
  // s2: minor stride (interval between different second letters)
  // prefix: the registration prefix
  //
  // optionally:
  //   alphabet: the alphabet to use (defaults full_alphabet)
  //   first: the suffix to use at the start of the range (default: AAA)
  //   last: the last valid suffix in the range (default: ZZZ)

     var stride_mappings = [
     { start: 0x008011, s1: 26*26, s2: 26, prefix: "ZS-" },

     { start: 0x390000, s1: 1024, s2:  32, prefix: "F-G" },
     { start: 0x398000, s1: 1024, s2:  32, prefix: "F-H" },

     { start: 0x3C4421, s1: 1024,  s2: 32, prefix: "D-A", first: 
     'AAA', last: 'OZZ' },
     { start: 0x3C0001, s1: 26*26, s2: 26, prefix: "D-A", first: 
     'PAA', last: 'ZZZ' },
     { start: 0x3C8421, s1: 1024,  s2: 32, prefix: "D-B", first: 
     'AAA', last: 'OZZ' },
     { start: 0x3C2001, s1: 26*26, s2: 26, prefix: "D-B", first: 
    'PAA', last: 'ZZZ' },
    { start: 0x3CC000, s1: 26*26, s2: 26, prefix: "D-C" },


{ start: 0x3D04A8, s1: 26*26, s2: 26, prefix: "D-E" },


 { start: 0x3D4950, s1: 26*26, s2: 26, prefix: "D-F" },
        { start: 0x3D8DF8, s1: 26*26, s2: 26, prefix: "D-G" },
        { start: 0x3DD2A0, s1: 26*26, s2: 26, prefix: "D-H" },
        { start: 0x3E1748, s1: 26*26, s2: 26, prefix: "D-I" },

        { start: 0x448421, s1: 1024,  s2: 32, prefix: "OO-" },
        { start: 0x458421, s1: 1024,  s2: 32, prefix: "OY-" },
        { start: 0x460000, s1: 26*26, s2: 26, prefix: "OH-" },
        { start: 0x468421, s1: 1024,  s2: 32, prefix: "SX-" },
        { start: 0x490421, s1: 1024,  s2: 32, prefix: "CS-" },
        { start: 0x4A0421, s1: 1024,  s2: 32, prefix: "YR-" },
        { start: 0x4B8421, s1: 1024,  s2: 32, prefix: "TC-" },
        { start: 0x740421, s1: 1024,  s2: 32, prefix: "JY-" },
        { start: 0x760421, s1: 1024,  s2: 32, prefix: "AP-" },
        { start: 0x768421, s1: 1024,  s2: 32, prefix: "9V-" },
        { start: 0x778421, s1: 1024,  s2: 32, prefix: "YK-" },
        { start: 0x7C0000, s1: 1296,  s2: 36, prefix: "VH-" },
        { start: 0xC00001, s1: 26*26, s2: 26, prefix: "C-F" },
        { start: 0xC044A9, s1: 26*26, s2: 26, prefix: "C-G" },
        { start: 0xE01041, s1: 4096,  s2: 64, prefix: "LV-" }
        ];
        function lookup(hexid) {
        var hexid = +("0x" + hexid);

        reg = n_reg(hexid);
        if (reg)
        return reg;

        reg = ja_reg(hexid);
        if (reg)
        return reg;

        reg = hl_reg(hexid);
        if (reg)
        return reg;

        reg = numeric_reg(hexid);
        if (reg)
        return reg;

        reg = stride_reg(hexid);
        if (reg)
        return reg;

        return null;
        }

         function stride_reg(hexid) {
         // try the mappings in stride_mappings
         var i;
         for (i = 0; i < stride_mappings.length; ++i) {
         var mapping = stride_mappings[i];
         if (hexid < mapping.start || hexid > mapping.end)
         continue;

         var offset = hexid - mapping.start + mapping.offset;

         var i1 = Math.floor(offset / mapping.s1);
         offset = offset % mapping.s1;
         var i2 = Math.floor(offset / mapping.s2);
         offset = offset % mapping.s2;
         var i3 = offset;

         if (i1 < 0 || i1 >= mapping.alphabet.length ||
         i2 < 0 || i2 >= mapping.alphabet.length ||
         i3 < 0 || i3 >= mapping.alphabet.length)
         continue;

         return mapping.prefix + mapping.alphabet.charAt(i1) + 
         mapping.alphabet.charAt(i2) + mapping.alphabet.charAt(i3);
         }

        // nothing
        return null;
        }


        // US N-numbers
        //

        function n_letters(rem) {
        if (rem == 0)
        return "";

        --rem;
        return limited_alphabet.charAt(Math.floor(rem / 25)) + 
        n_letter(rem % 25);
        }

        function n_letter(rem) {
        if (rem == 0)
        return "";

       --rem;
      return limited_alphabet.charAt(rem);


      function n_reg(hexid) {
      var offset = hexid - 0xA00001;
      if (offset < 0 || offset >= 915399) {
      return null;
      }

     var digit1 = Math.floor(offset / 101711) + 1;
     var reg = "N" + digit1;
     offset = offset % 101711;
     if (offset <= 600) {
     // Na, NaA .. NaZ, NaAA .. NaZZ
     return reg + n_letters(offset);
     }

     // Na0* .. Na9*
     offset -= 601;

     var digit2 = Math.floor(offset / 10111);
     reg += digit2;
     offset = offset % 10111;

     if (offset <= 600) {
     // Nab, NabA..NabZ, NabAA..NabZZ
     return reg + n_letters(offset);
     }

     // Nab0* .. Nab9*
     offset -= 601;

     var digit3 = Math.floor(offset / 951);
     reg += digit3;
     offset = offset % 951;

     if (offset <= 600) {
     // Nabc, NabcA .. NabcZ, NabcAA .. NabcZZ
     return reg + n_letters(offset);
     }

                // Nabc0* .. Nabc9*
                offset -= 601;

                var digit4 = Math.floor(offset / 35);
                reg += digit4.toFixed(0);
      offset = offset % 35;

      if (offset <= 24) {
      // Nabcd, NabcdA .. NabcdZ
      return reg + n_letter(offset);
      }

      // Nabcd0 .. Nabcd9
      offset -= 25;
      return reg + offset.toFixed

      (0);

1 Ответ

0 голосов
/ 23 ноября 2018

Шестнадцатеричный код режима используется в аэрокосмической / навигационной областях.
Из википедии:

Воздушным судам, оснащенным в режиме S, присвоен уникальный 24-битный адрес ИКАО или (неформально) Mode-S«шестнадцатеричный код» после государственной регистрации, и этот адрес становится частью свидетельства о регистрации воздушного судна.Как правило, адрес никогда не изменяется, однако транспондеры перепрограммируются и иногда перемещаются с одного воздушного судна на другое (предположительно в целях эксплуатации или в целях экономии), либо путем технического обслуживания, либо путем изменения соответствующей записи в системе управления полетом воздушного судна.

Имеется 16 777 214 (224-2) уникальных 24-битных адреса ИКАО (шестнадцатеричные коды). [4] [5]24-битный адрес ИКАО может быть представлен в трех цифровых форматах: шестнадцатеричном, восьмеричном и двоичном.Эти адреса используются для предоставления уникального идентификатора, обычно присваиваемого отдельному воздушному судну или регистрации.

Вы можете обнаружить, что воздушное судно просто ищет в Google шестнадцатеричный код каждого режима, например, для первого: https://www.radarbox24.com/data/mode-s/A00001#1068536488.

N-код - это код регистрации воздушного судна.Опять же, из Википедии:

В Соединенных Штатах регистрационный номер обычно называют номером «N», поскольку все зарегистрированные там воздушные суда имеют номер, начинающийся с буквы N. Буквенно-цифровая системаиспользуется из-за большого количества самолетов, зарегистрированных в Соединенных Штатах.N-число начинается с серии из одной или нескольких цифр, может заканчиваться одной или двумя буквенными буквами, может состоять всего из одного-пяти символов и должно начинаться с цифры, отличной от нуля.

Я не думаю, что существует какая-либо математическая или логическая связь между гексом режима и кодом регистрации самолета !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...