c ++ / c имеет доступ к нескольким массивам символов с разными именами и размерами

Я анализирую файл pcap и экспортирую диссекцию в виде c-массивов в Wireshark, мне нужно извлечь некоторые данные из рассматриваемых байтов. Однако я не знаю, как я могу получить доступ ко всем этим массивам.
Они выглядят так:

/* Frame (73 bytes) */
static const unsigned char pkt1324[73] = {
0x80, 0xe6, 0x50, 0x06, 0xe7, 0xae, 0x48, 0xfd, /* ..P...H. */
0x8e, 0xdf, 0x2f, 0x06, 0x86, 0xdd, 0x60, 0x00, /* ../...`. */
0x00, 0x00, 0x00, 0x13, 0x11, 0x30, 0x20, 0x01, /* .....0 . */
0x06, 0x60, 0x32, 0x07, 0x04, 0xc0, 0x00, 0x00, /* .`2..... */
0x00, 0x00, 0x00, 0x00, 0x40, 0x61, 0x20, 0x01, /* ....@a . */
0x08, 0x18, 0xdb, 0xf8, 0x70, 0x00, 0xcd, 0x3e, /* ....p..> */
0x83, 0xa5, 0x98, 0x71, 0x9b, 0x42, 0x16, 0x33, /* ...q.B.3 */
0xe8, 0xeb, 0x00, 0x13, 0x96, 0xfa, 0x50, 0x45, /* ......PE */
0xea, 0x50, 0x41, 0x0a, 0x21, 0xa8, 0xff, 0x31, /* .PA.!..1 */
0x37                                            /* 7 */
};
this is an empty line
/* Frame (84 bytes) */-> next frame

Мой вопрос в том, что эти массивы находятся в файле .c / .h, я хотел бы получить доступ ко всем массивам для извлечения некоторых данных, но их имя и размер изменяются.

Каков наилучший способ сделать это, зная, что мне нужно будет прочитать пару сотен массивов и извлечь определенные байты ???

4

Решение

Вы можете использовать такой инструмент: https://github.com/seladb/PcapPlusPlus
PcapPlusPlus — это многоплатформенная среда C ++ для анализа и анализа пакетов и обработки. PcapPlusPlus должен быть легким, эффективным и простым в использовании. Это оболочка C ++ для популярных движков, таких как libpcap, WinPcap, DPDK и PF_RING http://seladb.github.io/PcapPlusPlus-Doc

3

Другие решения

Вы можете разобрать файл, используя regex, который добавил в c++11

// g++ --std=c++11

#include <iostream>
#include <fstream>
#include <sstream>
#include <regex>
#include <string>class Array
{
std::string m_Name;
size_t m_Size;

public:
Array() = delete;

Array(const std::string &name, std::string size)
{
this->m_Name = name;
this->m_Size = static_cast<size_t>(stoi(size));
}

const std::string &GetName() const { return m_Name; }
size_t GetSize() const { return m_Size; }
};std::string readFile(const std::string &path)
{
std::ifstream fileStream(path);
std::stringstream buffer;

std::string line;

while (std::getline(fileStream, line))
buffer << line << std::endl;

return buffer.str();
}void writeFile(const std::string &path, const std::string &data)
{
std::ofstream fileStream(path);

fileStream << data;
}std::vector<Array> parseData(const std::string &data)
{
std::regex reg("static const unsigned char (pkt\\d+)\\[(\\d+)\\]");

auto begin = std::sregex_iterator(data.begin(), data.end(), reg);
auto end = std::sregex_iterator();

std::vector<Array> arrays;

for (std::sregex_iterator i = begin; i != end; i++)
{
std::smatch match = *i;
std::string name = match[1];
std::string size = match[2];

arrays.push_back(Array(name, size));
}

return arrays;
}int main()
{
std::string pktPath = "a.pkt";
std::string data = readFile(pktPath);

std::vector<Array> arrays = parseData(data);

std::stringstream names;
std::stringstream sizes;

names << "const unsigned char *names[] = {";
sizes << "size_t sizes[] = {";

for (const Array &arr : arrays)
{
names << arr.GetName() << ",";
sizes << arr.GetSize() << ",";
}

names << "};";
sizes << "};";

std::stringstream headerStream;
headerStream << "#include <cinttypes>" << std::endl;
headerStream << "#include \"" << pktPath << "\"" << std::endl << std::endl;
headerStream << "size_t sizeOfArrays = " << arrays.size() << ";" << std::endl;
headerStream << names.str() << std::endl;
headerStream << sizes.str() << std::endl;

std::string header = headerStream.str();
std::string headerPath = pktPath + ".h";
writeFile(headerPath, header);
}

этот код создает новый файл с именем a.pkt.h с последующим кодом:

#include <cinttypes>
#include "a.pkt"
size_t sizeOfArrays = 1;
const unsigned char *names[] = {pkt1324,};
size_t sizes[] = {73,};

Теперь вы проанализировали .pkt файлы и получили заголовок, который включает в себя все ваши массивы и размеры их.

#include "a.pkt.h"

int main()
{
for (size_t i = 0; i < sizeOfArrays; i++)
{
const unsigned char *array = names[i];
size_t size = sizes[i];

doSomething(array, size);
}
}

Если у вас есть какие-либо вопросы по поводу моего кода, прокомментируйте его.

1

По вопросам рекламы [email protected]