Запись 4 битов в двоичный файл с ofstream
Если у меня есть целое число без знака в диапазоне от 0 до 16, и я хочу записать его в двоичный файл без записи в него целого байта, как можно сдвинуть биты для его достижения?
0-16 означает, что мне нужно только 4 бита, поэтому я должен иметь возможность хранить 2 разных числа в одном байте, верно?
Следующий код записывает 1 число в 1 байт:
std::ofstream file;
file.open("test.bin", std::ios::binary|std::ios::out);
char oneByteNum = (char)fourByteNum; // Converting from some 4 byte integer to a 1 byte char
file.write(&oneByteNum ,sizeof(char));
Используя битовые сдвиги, как я могу получить 2 числа в 1 байте? Я полагаю, что чтение числа из байта было бы аналогичным обратным двухэтапным процессом?
3 ответа
Решение
char oneByteWithTwoNums = (oneByteNum1 << 4) + (oneByteNum2 & 0x0f);
Попробуй это:
compacted = first_number * 0x10 + second-number;
Расширять:
second_number = compacted & 0x0F;
first_number = compacted >> 4;
Я написал быстрый пример:
#include <iostream>
typedef unsigned char byte;
byte pack(unsigned int num1, unsigned int num2) {
// Our byte has the form 0b00000000
// We want the first four bits to be filled with num1
byte packed = num1 << 4;
// We want the last four bits to be filled with num2
// but, we don't want to overwrite the top four bits, so
// we mask it with 0x0F (0b0001111)
packed |= num2 & 0x0F;
return packed;
}
void unpack(byte b, unsigned int& num1, unsigned int& num2) {
// Extract the first four bits of our byte
num1 = b >> 4;
// Mask off the first four bits of our byte to get only
// the last four bits
num2 = b & 0x0F;
}
int main() {
unsigned int num1 = 5; // As an example
unsigned int num2 = 15; // As an example
byte b = pack(num1, num2);
unsigned int num3;
unsigned int num4;
unpack(b, num3, num4);
std::cout << num3 << std::endl;
std::cout << num4 << std::endl;
return 0;
}
Возможно, вы захотите добавить проверки в ваши методы pack/unpack, чтобы кто-то не пытался передать значение, отличное от [0-15].