前言:
实际工程面临 进程A需要将发送类似结构体数组给进程B,即发送的数据流需要分为多组数据,每组可包含不同类型的数据,但每一组数据的类型必须一致。
因此开发数据流生成与数据流解析的demo。
结构体数组 数据流demo
代码分为2个文件:test.hpp、test.cpp
demo备注:
demo展示的数据流主要用于 进程到进程 / 核到核 / 端到端 之间的通信。
demo展示的数据流主要用于传输 类似 结构体数组(数据流的格式)的数据,一次可传输多组数据,每组数据可包含不同类型的数据。
数据流的格式为:
property1,property2,property3,property4;INT,ULONG,FLOAT,STRING;-1,1,1.100000,Aa1
string类型的数据不允许包含字符:“,”(组内数据分隔符)、“;”(组间数据分隔符),没有对其余字符做限制。
demo除了main函数、makeDataSteam1函数需要根据实际场景做修改,其他函数基本不需要修改。
demo:
test.hpp文件:
#pragma once
#include <vector>
#include <string>
enum PropertyDataTypeIndex {
E_DATA_TYPE_INT = 0,
E_DATA_TYPE_ULONG,
E_DATA_TYPE_FLOAT,
E_DATA_TYPE_STRING,
E_DATA_TYPE_NUM,
E_DATA_TYPE_NONE,
};
typedef struct {
int dataType;
int intItemData;
unsigned long ulongItemData;
float floatItemData;
std::string stringItemData;
} ItemProperty_t;
typedef struct {
int dataTypeIndex;
std::string dataType;
} DataType_t;
typedef struct {
std::string property;
int dataTypeIndex;
} PropertyType_t;
std::string GetDataType(unsigned int index);
unsigned int GetDataTypeIndex(std::string dataType);
std::string makePropertyDataSteam(const PropertyType_t *propertyTypeList,
int propertyTypeListSize,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
std::string makeTypeDataSteam(const PropertyType_t *propertyTypeList,
int propertyTypeListSize,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
int CalcGroupNum(const std::string &dataSteam,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
std::vector<int> GetPropertyType(const std::string &dataSteam,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
std::vector<std::vector<ItemProperty_t>> GetPropertyData(const std::string &dataSteam,
const std::vector<int> &propertyType,
const std::string &dataSteamHeader,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
std::string makeDataSteam1(const PropertyType_t *propertyTypeList,
int propertyTypeListSize,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
std::vector<std::vector<ItemProperty_t>> ParseData(const std::string &input,
const PropertyType_t *propertyTypeList,
int propertyTypeListSize,
const std::string &segmentSeparatorSymbol,
const std::string &teamSeparatorSymbol);
test.cpp文件:
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include "test_01.hpp"
const DataType_t g_dataTypeList[] = {
{
E_DATA_TYPE_INT, "INT"},
{
E_DATA_TYPE_ULONG, "ULONG"},
{
E_DATA_TYPE_FLOAT, "FLOAT"},
{
E_DATA_TYPE_STRING, "STRING"},
};
std::string GetDataType(unsigned int index)
{
std::string ret = "";
if (index >= E_DATA_TYPE_NUM) {
return ret;
}
for (int i = 0; i < (sizeof(g_dataTypeList) / sizeof(g_dataTypeList