Есть ли способ индексировать массив в C ++, как в Python? - PullRequest
0 голосов
/ 23 декабря 2018

Чтобы написать сниффер пакета, мне нужно иметь возможность индексировать байты пакета.

Я пришел из python, в python вы можете очень легко индексировать список, например;

variable = data[2:5]. In c++ you can't do it like that.

Вот фрагмент моего кода

void ethernet_frame(char raw_data[19]){

    struct ethernet{ 
        char dest_mac[6] = get_mac_addr(raw_data[:7]);
        char src_mac[6] = get_mac_addr(raw_data[7:14]);
        unsigned short proto  = proto[14:17]; 
    };
}

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

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Нет встроенного способа сделать это, но C ++ позволяет вам создавать абстракции для достижения ваших целей.Например,

void ethernet_frame(std::array<char, 19> raw_data)
{
    struct ethernet
    {
        std::array<char, 6> dest_mac;
        std::array<char, 6> src_mac;
    };

    ethernet e{slice<0, 7>(raw_data), slice<7, 14>(raw_data)};
}

Где slice - это что-то вроде:

template <std::size_t Begin, std::size_t End, typename T>
auto slice(const T& range)
{
    constexpr auto count = End - Begin - 1;
    std::array<std::decay_t<decltype(*range.begin())>, count> result;
    std::copy(range.begin() + Begin, range.begin() + End, result.begin());
    return result;
}
0 голосов
/ 23 декабря 2018

C ++ не является Python.Таким образом, вы не можете кодировать следующим образом.

Возможно, вы захотите использовать арифметику указателей (например, raw_data+7, если raw_data - это char*)

Вы можете использовать итераторы и диапазон для .Затем вы хотите использовать контейнеры , такие как std::array или std::vector

Пожалуйста, потратьте несколько дней или недель, чтобы прочитать хорошую книгу по программированию C ++ .У нас здесь нет ни времени, ни места.

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