C ++中的数据块构建逻辑

时间:2015-04-25 12:12:42

标签: c++

嗯,对某些人来说可能很简单,但到目前为止我无法找到任何强大的逻辑来构建以下数据块。

  1. 我有一大块char *或std :: string数据,大小为1505字节
  2. 我需要将此数据剪切为每个最大500字节
  3. 每个数据都应该以特定的字符串集
  4. 开头

    请参阅以下数据块(即1505字节的完整数据集) 在这里,我需要将这些数据切割成500个字节的块(例如,我将它放入一个向量元素),每个元素文本应该以[SampleSet]开头。所以有可能在一个向量元素中我有两个或更多个SampleSet但在其他向量元素中我只得到一个[SampleSet]。

    任何线索我怎么能从这开始?

    [SampleSet]
    SampleTime=2014-08-13 T12:02:04
    Data=Type:DataType|Value:0.11|Alert:false|Lead:II
    Data=Type:DataType|Value:65|Alert:false
    Data=Type:DataType|Value:95|Alert:false
    Data=Type:DataType|Value:97.8|Alert:false|Channel:1
    Data=Type:DataType|Value:90|Alert:false
    Data=Type:DataType|Value:0.10|Alert:false|Lead:I
    Data=Type:DataType|Value:0.20|Alert:true|Lead:II
    
    [SampleSet]
    SampleTime=2014-08-13 T12:05:09
    Data=Type:DataType|Value:82|Alert:false
    Data=Type:DataType|Value:98|Alert:true
    Data=Type:DataType|Value:97.8|Alert:false|Channel:1
    Data=Type:DataType|Value:97.8|Alert:false|Channel:1
    Data=Type:DataType|Value:97.2|Alert:false|Channel:2
    Data=Type:DataType|Value:31|Alert:false
    Data=Type:DataType|Value:120|Alert:true
    Data=Type:DataType|Value:95|Alert:true
    Data=Type:DataType|Value:90|Alert:false
    Data=Type:DataType|Value:0.10|Alert:false|Lead:I
    Data=Type:DataType|Value:0.20|Alert:true|Lead:II
    
    [SampleSet]
    SampleTime=2014-08-13 T12:05:20
    Data=Type:DataType|Value:82|Alert:false
    Data=Type:DataType|Value:98|Alert:true
    Data=Type:DataType|Value:31|Alert:false
    Data=Type:DataType|Value:120|Alert:true
    Data=Type:DataType|Value:95|Alert:true
    Data=Type:DataType|Value:90|Alert:false
    Data=Type:DataType|Value:0.10|Alert:false|Lead:I
    Data=Type:DataType|Value:0.20|Alert:true|Lead:II
    
    [SampleSet]
    SampleTime=2014-08-13 T12:15:11
    Data=Type:DataType|Value:82|Alert:false
    Data=Type:DataType|Value:0.10|Alert:false|Lead:I
    Data=Type:DataType|Value:0.20|Alert:true|Lead:II
    

1 个答案:

答案 0 :(得分:2)

最直观的方法可能是使用std::string::find在输入字符串中查找所有标题(= "[SampleSet]")的位置。然后,您可以将此输入字符串剪切为令牌,其中每个令牌只包含一个样本集。然后,您可以使用这些令牌来构建500字节的最大块。但是,如果您的样本集的大小通常比块大小小得多,那么您也经常调用find

因此,更好的方法是使用std::string::rfind开始向后搜索500字节块边界右侧的[SampleSet] - 标头。即找到第一个块开始向后搜索位置[SampleSet]的标题500。你从中获得的位置(例如467)是第一个块的右边界。要查找下一个块,请开始在467+500向后搜索,依此类推。我希望这个方法很清楚。这是一个示例实现:

std::string input; // your input data
std::vector<std::string> chunks;
std::string header("[SampleSet]");
std::string::size_type chunksize = 500; // size including header
std::string::size_type posL, posR = 0, posEnd = input.length()+1;

while(posR != posEnd) 
{
    posL = posR;
    if (posEnd-posL <= chunksize)
        posR = posEnd;
    else
        posR = input.rfind(header, posL+chunksize);

    if (posR-posL)
        chunks.push_back(input.substr(posL, posR-posL));
    else
    {
        std::string toobigsample(input.substr(posL, input.find(header,posL+1)-posL));
        std::cerr  << "Error: SampleSet to big to store in one chunk ("
                  << toobigsample.length() << " bytes):" << std::endl << std::endl
                  << toobigsample;
        break;
    }
}