C++自学篇 以类似结构体数组的形式生成与解析数据流

前言:
实际工程面临 进程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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值