Преобразование беззнакового 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);
}