Не совсем.
Файл поступает в режиме с прямым порядком байтов, поскольку в нем скопились потоковые пакеты. Я должен обратить длину пакетов, чтобы "переинтерпретировать" их в правильный тип переменной.
Вам нужно обратить байты на уровне хранимых данных, а не файла и не пакетов.
Например, если файл хранит структуру.
struct S {
int i;
double d;
char c;
};
чтобы прочитать структуру, вам нужно будет обратить вспять:
int: [4321]->[1234] // sizeof(int) == 4, swap the order of 4 bytes
double: [87654321]->[12345678] // sizeof(double) == 8, swap the order of 8 bytes
char: [1]->[1] // sizeof(char) == 1, swap 1 byte (no swapping needed)
Не вся структура сразу.
К сожалению, это не так тривиально, как просто обратить блок данных в файле или сам файл. Вам необходимо точно знать, какой тип данных хранится, и перевернуть в нем байты.
Функции в inet.h
используются именно для этой цели, поэтому я рекомендую вам их использовать.
Итак, это приводит нас к строкам. Если вы храните строки c в файле, вам нужно поменять их местами? Ну, а строка c - это последовательность из 1 байта char
с. Вам не нужно менять 1 байт char
с, поэтому вам не нужно менять данные в строке c!
Если вы действительно хотите поменять местами 6 байтов, вы можете использовать функцию std::reverse
:
char in[6] = get6bytes();
cout << in << endl; // shows abcdef
std::reverse(in, in+6);
cout << in << endl; // shows fedcba
Если вы делаете это в любом крупном масштабе (большое количество типов), то вы можете подумать о написании генератора кода, который генерирует эти функции перестановки байтов (и функции чтения файлов), это не тоже трудно, если вы можете найти инструмент для анализа структур в c (я использовал для этого gcc-xml , или, может быть, clang поможет).
Это делает сериализацию более сложной проблемой. Если это в ваших силах, вы можете рассмотреть возможность использования XML или буферов протокола Google для решения этих проблем за вас.