我最近提出了另一个关于解析二进制文件的问题,我感谢大家在这里工作。
但我现在面临新的挑战,我需要帮助。
我的二进制文件看起来像这样但更长......
ST .........¸。°Ý.ø...0.œ........... ESZ4 1975 .......... IYH。 testDBDBDBDBST ...........°Ý.ø................... DBDBDBDBST .........P.'Ý。 ø...0.œ........... ESZ4 1975 .......... HTC.testDBDBDBDBST ......... <,'Ý... ................. DBDBDBDBST .........ƒD.Þ.ø...0.œ........... ESZ4 1975 .......... ARM.testDBDBDBDBST .........«E.Þ.ø................... DBDBDBDB < / p>
基本上,每条消息都以'ST'开头,以'DBDBDBDB'结尾。目标是解析每条消息并将消息存储到数据结构中。此外,每条消息都根据类型而有所不同,不同类型的消息将有其他成员。
我遇到的问题是,我不知道如何遍历这个二进制文件...如果它是一个常规文件,我可以做(getline(file,s)),但二进制文件怎么样? ?有没有办法说,找到第一个“ST”和“DBDBDBDB”并解析中间的东西,然后转到下一组ST和DB?或者以某种方式逐步读取文件,跟踪我的位置?
我提前为发布这么多代码而道歉。
/* Prevent block display and transition animation */
.expand-icon.collapse.in,
.collapse-icon.collapse.in {
display: inline; }
.expand-icon.collapsing {
display: none; }
/* HTML Toggler with glyphicons */
<a data-toggle="collapse" href=".my-collapse">
<span class="my-collapse collapse-icon collapse in">
<span class="glyphicon glyphicon-collapse-up"></span>
</span>
<span class="my-collapse expand-icon collapse">
<span class="glyphicon glyphicon-expand"></span>
</span>
</a>
非常感谢.....
答案 0 :(得分:0)
您可以将整个文件读取到缓冲区,然后根据您的要求解析缓冲区。
我会用
fread
将整个文件读取到缓冲区,然后逐字节处理/解析缓冲区。
这是一个例子:
/* fread - read an entire file to a buffer */
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE * pFile;
long lSize;
char * buffer;
size_t result;
pFile = fopen ( "myfile.bin" , "rb" );
if (pFile==NULL)
{fputs ("File error",stderr); exit (-1);}
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) // malloc failed
{fputs ("Memory error",stderr); exit (-2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != lSize)
{fputs ("Reading error",stderr); exit (-3);}
// the whole file is now loaded in the memory buffer.
// you can process the whole buffer now:
// for (int i=0; i<lSize;i++)
// {
// processBufferByteByByte(buffer[i]);
// }
// or
// processBuffer(buffer,lSize);
// terminate
fclose (pFile);
free (buffer);
return 0;
}