c++/c访问多个不同名称和大小的char数组
Posted
技术标签:
【中文标题】c++/c访问多个不同名称和大小的char数组【英文标题】:c++/c access multiple char arrays with different names and sizes 【发布时间】:2018-06-05 14:29:10 【问题描述】:我正在分析一个 pcap 文件,并且我已经在 Wireshark 中将剖析导出为 c 数组,我需要从相关字节中提取一些数据。但是我不知道如何访问所有这些数组。 它们看起来像这样:
/* 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 文件中,我想访问所有数组以提取一些数据,但它们的名称和大小会发生变化。
知道我需要读取几百个数组并提取某些字节,最好的方法是什么???
【问题讨论】:
【参考方案1】:你可以使用这样的工具:https://github.com/seladb/PcapPlusPlus PcapPlusPlus 是一个多平台的 C++ 网络嗅探和数据包解析和制作框架。 PcapPlusPlus 旨在轻巧、高效且易于使用。它是 libpcap、WinPcap、DPDK 和 PF_RING 等流行引擎的 C++ 包装器http://seladb.github.io/PcapPlusPlus-Doc
【讨论】:
我已通读文档,但我认为该工具没有我想要的东西,我真正想要的是一种方法来浏览我之前导出的所有数组,这些数组都不同名称和尺寸。顺便说一句,谢谢【参考方案2】:可以使用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);
如果您对我的代码有任何疑问,请发表评论。
【讨论】:
以上是关于c++/c访问多个不同名称和大小的char数组的主要内容,如果未能解决你的问题,请参考以下文章