Я пытаюсь прочитать данные из двоичного файла.Один блок данных имеет длину 76 байтов (это зависит от количества 2-байтовых «основных элементов данных» в середине блока).Первый элемент данных составляет 4 байта, второй - 4 байта, а затем имеется набор из 2 байтовых основных элементов данных, а в конце - еще 2 2-байтовых фрагмента данных.
![enter image description here](https://i.stack.imgur.com/SXWh0.png)
На основе этого примера Delphi Я научился читать файл с кодом ниже:
short AShortInt; // 16 bits
int AInteger; // 32 bits
try
{
infile=new TFileStream(myfile,fmOpenRead); // myfile is binary
BR = new TBinaryReader(infile, TEncoding::Unicode, false);
for (int rows = 0; rows < 5; rows++) { // just read the first 5 blocks of data for testing
AInteger = BR->ReadInt32(); // read first two 4 byte integers for this block
AInteger = BR->ReadInt32();
for (int i = 0; i < 32; i++) { // now read the 32 2-byte integers from this block
AShortInt = BR->ReadInt16();
}
AShortInt = BR->ReadInt16(); // read next to last 2-byte int
AShortInt = BR->ReadInt16(); // read the last 2-byte int
}
delete infile;
delete BR;
Close();
}
catch(...)
{
delete infile; // closes the file, doesn't delete it.
delete BR;
ShowMessage("Can't open file!");
Close();
}
Но я хотел бы использовать буфер шириной 76 байт, чтобы прочитать весь блок, а затем выбрать различные данные из этого буфера.Я собрал следующий код , основанный на этом вопросе , и я могу прочитать целый блок данных в буфер.
UnicodeString myfile = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDocumentsPath(), "binaryCOM.dat");
TFileStream*infile=0;
try
{
infile=new TFileStream(myfile,fmOpenRead);
const int bufsize=76;
char*buf=new char[bufsize];
int a = 0;
while(int bytesread=infile->Read(buf,bufsize)) {
a++; // just a place to break on Run to Cursor
}
delete[]buf;
}
catch(...)
{
delete infile;
ShowMessage("Can't open file!");
Close();
}
Но я не могу понять, как собрать подмножества из байтов в буфере.Есть ли способ объединить байт ?Так что я мог бы прочитать блок данных в 76-байтовый буфер и затем сделать что-то вроде этого ниже?
unsigned int FirstDatum = buf[0]+buf[1]+buf[2]+buf[3]; // concatenate the 4 bytes for the first piece of data
Это будет приложение FMX для Win32, iOS и Android, встроенное в C ++ Builder 10.30,2.