Чтение 6 байтов из буфера - PullRequest
0 голосов
/ 29 марта 2011

Ребята, мне нужно прочитать 6 байтов из файлового буфера и сохранить их как число без знака.

ifstream ifs("dummy.txt", ios::binary);
unsigned __int64 result = 0;
ifs.read((char*)&result, 6);

Это правильно?

1 Ответ

3 голосов
/ 29 марта 2011

Во-первых, стандартный тип 64-разрядного целого числа без знака - это «unsigned long long» или «uint64_t».И, во-вторых, вы должны знать формат данных в файле, который вы читаете.Я никогда не видел формат, который использует шесть байтов, поэтому трудно угадать, но, предположив, что это двоичный файл, вы должны использовать:

uint64_t readSix( std::istream& src )
{
    uint64_t result = checkedGet( src ) ;
    result |= checkedGet( src ) <<  8;
    result |= checkedGet( src ) << 16;
    result |= checkedGet( src ) << 24;
    result |= checkedGet( src ) << 32;
    result |= checkedGet( src ) << 48;
    return result;
}

или

uint64_t readSix( std::istream& src )
{
    uint64_t result = checkedGet( src ) << 48;
    result |= checkedGet( src ) << 32;
    result |= checkedGet( src ) << 24;
    result |= checkedGet( src ) << 16;
    result |= checkedGet( src ) <<  8;
    result |= checkedGet( src );
    return result;
}

в зависимости отформат, с:

unsigned char checkedGet( std::istream& src )
{
    int result = src.get();
    if ( result == EOF )
        throw UnexpectedEof();
    return result;
}
...