c++ - 读取二进制数据以查找十六进制序列
问题描述
我有一个二进制文件要从文件中读取,文件内部是非固定长度的数据,但它们确实具有开始和停止序列。
开始序列为 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
}
}
我如何设置从二进制文件中读取,写入字节直到停止序列,然后重复文件的其余部分?
解决方案
我编写了一些示例代码,它扫描给定的字节向量并将在开始/停止序列之间找到的字节运行存储到字节向量向量中。
还没有真正测试过它,但它确实可以编译:-)
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;
}
}
}
推荐阅读
- vue.js - 调整窗口大小时,Vue Owl Carousel 崩溃
- laravel - 三个相互关联的下拉框
- node.js - POST 请求不返回 DATA 到 Express 即服务器
- sql - 添加日期+3个工作日的功能,不包括周末和节假日
- azure - 是否可以将 MQTT 消息发送到事件中心?还是有其他方法?
- swift - 在 reactswift 中传递的观察事件
- php - 为什么只有 1 个复选框的数组值插入到表中
- mysql - 使用 group by 获取累积总和
- regex - 如何将在不同行上拆分的特定字符串/正则表达式匹配为单独的字符串?
- twitter-bootstrap - How do I install bootstrap 4 template to Ember web project?