Преобразование беззнакового int в байтовый массив и обратно

Для моего личного проекта на C++ я пытался сохранить некоторые данные в двоичном файле. Я провел некоторое исследование в Google и нашел несколько методов, которые более или менее сводились к одному и тому же. Тем не менее, я не могу на всю жизнь заставить метод чтения или записи работать правильно. Любое значение, которое я пишу, я получаю по-другому. Я много гуглил и просматривал Stackru, но я не нашел решения, поэтому начинаю думать, что, должно быть, что-то упускаю, но никак не могу понять, что именно.

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

unsigned short ReadUShort(std::ifstream& ifs)
{
    unsigned char buffer[2];

    ifs.read((char*)buffer, 2);
    unsigned short val = (buffer[0] << 8) | buffer[1];

    return val;
}

void WriteUShort(std::ofstream& ofs, unsigned short val)
{
    unsigned char buffer[2];

    buffer[0] = (val & 0xff);
    buffer[1] = ((val >> 8) & 0xff);

    ofs.write((char*)buffer, 2);
}

Заранее благодарю за любую помощь.

2 ответа

Решение

У вас есть все наоборот. Попробуйте это во время чтения:

unsigned short val = ((unsigned short)buffer[1] << 8) | buffer[0];

Ваш read рутина читает в порядке с прямым порядком байтов (сначала старший байт), а ваш write рутина записывает в порядке с прямым порядком байтов (сначала младший байт). Вам придется выбрать один или другой.

Реализация с прямым порядком байтов:

unsigned short ReadUShort(std::ifstream& ifs)
{
    unsigned char buffer[2];

    ifs.read((char*)buffer, 2);
    unsigned short val = (buffer[0] << 8) | buffer[1];

    return val;
}

void WriteUShort(std::ofstream& ofs, unsigned short val)
{
    unsigned char buffer[2];

    //SWAPPED FROM LITTLE-ENDIAN TO BIG-ENDIAN
    buffer[0] = ((val >> 8) & 0xff); 
    buffer[1] = (val & 0xff);

    ofs.write((char*)buffer, 2);
}
Другие вопросы по тегам