首页 > 解决方案 > 读取二进制数据以查找十六进制序列

问题描述

我有一个二进制文件要从文件中读取,文件内部是非固定长度的数据,但它们确实具有开始和停止序列。

开始序列为 0x1B 0x5B 0x30 0x48
停止序列为 0x1b 0x5B 0x31 0x48

这个特定的文件确实有 28 个条目,认为有多少条目可能不同。

我已经将二进制文件读入到文件大小的向量中

ifstream datafile("myfile.bin", ios_base::in|ios_base::binary);
vector<char> buff;
int size = datafile.tellg();
buff.resize(size);

datafile.read(buff.data(), size);

现在我尝试逐字节迭代向量(因为这就是它存储在向量中的方式对吗?但这不是我想要的。

阅读将数据写入另一个向量会很好(temp ) 变量,然后在我看到停止序列时停止写入它。然后继续使用向量的其余部分,写入另一个变量,直到看到下一个停止序列等。就像写入vector<vector<char>>?

下面是我逐字节进行的迭代。

for (vector<char>::iterator it = buff.begin(); it != buff.end(); ++it)
{
  if (*it == 0x1B)
  {
    // found ESC char
  }
}

我如何设置从二进制文件中读取,写入字节直到停止序列,然后重复文件的其余部分?

标签: c++linuxbinarybyteifstream

解决方案


我编写了一些示例代码,它扫描给定的字节向量并将在开始/停止序列之间找到的字节运行存储到字节向量向量中。

还没有真正测试过它,但它确实可以编译:-)

void findSequences( vector< char >& buff, vector< vector< char > > *dataRuns )
{
  char startSequence[] = { 0x1B, 0x5B, 0x30, 0x48 };
  char endSequence[] = { 0x1b, 0x5B, 0x31, 0x48 };

  bool findingStart = true;

  vector< char >::iterator it = buff.begin();
  vector< char >::iterator itEnd = buff.end();
  while ( it != itEnd )
  {
    vector< char >::iterator findIt;
    if ( findingStart )
      findIt = search( it, itEnd, startSequence, startSequence + 4 );
    else
      findIt = search( it, itEnd, endSequence, endSequence + 4 );

    if ( findIt != itEnd )
    {
      if ( findingStart )
      {
        it = findIt + 4;
        findingStart = false;
      }
      else
      {
        dataRuns->push_back( vector< char >( it, findIt ) );
        it = findIt + 4;
        findingStart = true;
      }
    }
    else
    {
      // failed to find a start or stop sequence

      break;
    }
  }
}

推荐阅读