How can I recover binary data from the INTDATA file using the provided C structure?
Can anyone help me in solving this i am in analysis paralysis right now cannot wrap my head around the problem
Programming Exercise
NOTE: ALL INFORMATION REQUIRED TO COMPLETE THE TASK IS INCLUDED IN THIS README FILE.
The INTDATA file contains an hex-ASCII dump of binary data, with some header
information for each block. This file was produced by extracting the binary data
from a data collection unit running an Intel CPU, and saving it in human-readable
format. The task is to write a recovery program that operates on the hex-ASCII
representation of the binary data and recovers the data correctly.
Here is a 'c' structure definition which shows, in the data block, the
positions of the items in the block:
struct flashdata
{
uint16 filename_id; // number for file
uint32 sequence_in_file; // file sequence number
uint16 number_records; // recs in block
uint16 data_length; // data length
uint16 flags; // unused presently
unsigned char compression_type; // unused presently
unsigned char spare; // unused presently
unsigned char data[2048-14]; // the data itself
};
The blocks need to have the binary data extracted from them. Then check the
block. If the filename_id is not 0002 then discard the block. If the block
has obvious errors (data_length>2048-14) then discard. Otherwise use the
data_length, number_records and data fields to extract the data records.
Record structure:
<length><flags><len2> <data.......>
9 Replies
@electro_coco Start by writing a function to
read
the INTDATA
file and convert the hex-ASCII
data back into binary
. This will give you the raw data blocks that match the flashdata
structure, once you have the binary
data, you’ll need to parse
it into flashdata
structures. For each block
, check the filename_id
. If it’s not 0002
, discard
the block, next, validate
the block by checking data_length
. If data_length
is greater than 2048-14
, discard
the block, for valid blocks
, extract the data records
using the number_records
and data_length
fields. You’ll need to carefully parse the <length
>, <flags
>, <len2
>, and <data
> fields from the data array.thank you i was not sure that whether i should convert data back to binary
how can i convert hex ascii to binary
Use
strtol
in C
to convert the hex-ASCII
strings into binary. You can read each line
of the file
, convert the hex
values, and store them in a buffer
that represents your binary data block.Once you have the
binary data
, you can cast it to a flashdata struct
. Make sure you handle the endianness
correctly, as Intel CPUs
are little-endian.thank you i knew that i have to cast it to flash data struct the binary data of each block but how to handle endianness
For instance if you
detect
that the data
is in big-endian
format and needs to be converted to little-endian
(or vice versa), you’ll have to perform byte swapping
to convert a 16-bit
or 32-bit
value from big-endian
to little-endian
, using this approach
so the complete binary data of file needs to be converting to big endian