Вот мой вопрос
Я прочитал двоичную последовательность из двоичного файла в массив символов. Мой двоичный файл намного больше, чем мой буфер, поэтому я читал его итеративно.
Я прочитал 16 байтов из файла и char * myPointer
указателе char * myPointer
. Теперь из myPointer мне нужно создать 4 целых числа, и я не знаю, как это сделать. Кто-нибудь может мне помочь?
Примечание. Мне не нужно хранить его в массиве символов, если у вас есть лучшее решение
Если консистенция сохраненных данных совпадает с консистенцией вашей системы, вы можете использовать следующий код для хранения данных чтения в int
:
int ints[4];
char bytes[4*sizeof(int)];
memcpy( ints, bytes, sizeof( ints ) );
Если у вас есть разные endianess во входном двоичном файле и на вашем компьютере, вы можете захотеть поменять биты:
template< class T>
void changeEndianess( T & input)
{
char temp[ sizeof( T ) ];
for( int j=sizeof( T )-1; j>=0; --j )
temp[sizeof(T)-j-1] = *((char *)&input+j);
memcpy( &input, temp, sizeof( T ) );
}
// and somewhere in your program:
for( size_t i=0; i<sizeof( ints ); ++i )
{
changeEndianess<int>( ints[i] );
}
Для того, чтобы это использовать short
изменение всех int
в коде выше на short
, но это до вас, чтобы решить, когда это необходимо.
memcpy
. memcpy(ints, bytes, sizeof ints);
, Готово.
Чтение из двоичного файла:
#include <fstream>
#include <assert.h>
void main()
{
std::ifstream file("file.dat", std::ios_base::binary);
assert(file.is_open());
int i = 0;
file.read((void*)&i, sizeof(i));
short s = 0;
file.read((void*)&s, sizeof(s));
... // And so on
}
Очевидно, вам нужно точно знать, как интерпретировать данные, то есть структуру файла (какой тип данных записывается где).