Конвертировать структуру с прямым порядком байтов в формат C ++ с прямым порядком байтов - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю над кодом синтаксического анализатора для чтения всех данных из двоичного файла.Между прочим, бинарный файл находится в Big-Endian.Когда я читаю двоичный заголовок файла, я читаю его в Structure с помощью этого метода:

Структура:

struct BinaryHeader{
    int jobID; 
    int lineNumber; 
    int reelNumber; 
    short unsigned int tracesPerEnsemble; 
    short int aTracesPerEnsemble; 
    short unsigned int sampleInterval; 
    short unsigned int sampleIntervalOriginalFieldRec; 
    short unsigned int samplesPerTrace; 
    short unsigned int samplesPerTraceOriginalFieldRec;
    ...etc.

Метод анализа:

void Segy::parseSegyFile(){
    char textHeader[3200]; //to skip the first 3200 byte
    ifs.read(textHeader,sizeof(textHeader));
    BinaryHeader binaryHeader;
    ifs.read(reinterpret_cast<char *>(&binaryHeader), sizeof(binaryHeader));
    }
}

Как я уже упоминал, порядковый номер является Big-Endian, я нашел этот ответ для преобразования, и он работает как обаяние, но когда - например - яраспечатать двоичный заголовок Я всегда должен поменять местами последовательность байтов.

std::cout << std::left << std::setw(w) << "JobID:" << std::fixed << SwapEnd(binaryHeader.jobID) << std::endl

Вопрос: Есть ли какой-нибудь элегантный способ конвертировать весь binaryHeader в Little-Endian?

1 Ответ

0 голосов
/ 18 февраля 2019

Ну, я не знаю, относится ли это к вам, но boost :: fusion может вам помочь.

struct BinaryHeader{
    int jobID; 
    int lineNumber; 
    int reelNumber; 
    ...
};
BOOST_FUSION_ADAPT_STRUCT(
    BinaryHeader,
    jobID,
    lineNumber,
    reelNumber
    ...
)
struct EndianSwap
{
    template<typename T>
    void operator()(T& t) const
    {
        SwapEnd(t);
    }
};

тогда после прочтения BinaryHeader в языке с прямым порядком байтов простоэто.

boost::fusion::for_each(b, EndianSwap());
...