c ++ создает 4 целых числа из 16-байтового массива символов

0

Вот мой вопрос

Я прочитал двоичную последовательность из двоичного файла в массив символов. Мой двоичный файл намного больше, чем мой буфер, поэтому я читал его итеративно.

Я прочитал 16 байтов из файла и char * myPointer указателе char * myPointer. Теперь из myPointer мне нужно создать 4 целых числа, и я не знаю, как это сделать. Кто-нибудь может мне помочь?

Примечание. Мне не нужно хранить его в массиве символов, если у вас есть лучшее решение

  • 0
    Что вы подразумеваете под «создавать» ? Что вы собираетесь с ними делать?
  • 0
    @Michael Майкл, важно, что я собираюсь делать? Используя первые 4 байта массива, я хочу создать первый itneger и так далее
Показать ещё 6 комментариев
Теги:
pointers
binaryfiles
integer

2 ответа

0
Лучший ответ

Если консистенция сохраненных данных совпадает с консистенцией вашей системы, вы можете использовать следующий код для хранения данных чтения в 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, но это до вас, чтобы решить, когда это необходимо.

  • 0
    @Lukasz_Daniluk, как я уже говорил выше, я не всегда сохраняю его в целое число, иногда мне также нужно хранить его в коротком
  • 0
    Этот код просто плохо реализован memcpy . memcpy(ints, bytes, sizeof ints); , Готово.
Показать ещё 4 комментария
0

Чтение из двоичного файла:

#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
}

Очевидно, вам нужно точно знать, как интерпретировать данные, то есть структуру файла (какой тип данных записывается где).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню