#c #linux #serialization #std-bitset
#c #linux #сериализация #std-набор битов
Вопрос:
Как использовать контейнер набора битов C с функциями чтения / записи Linux API?
Что-то вроде этого:
#include <vector>
#include <bitset>
#include <fcntl.h> // Linux API open
#include <unistd.h> // Linux API read,write,close
using namespace std;
int main() {
// Some 8-bit register of some device
// Using vector for read and write operations.
// Using bitset to manipulate individual bits.
vector<bitset<8>> control_register;
// Set bit 1 of control_register to 1 (true).
control_register[0].set(1);
// Open new file for writing (create file)
int fd = 0;
const char *path = "./test.txt";
fd = (open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU));
// Write to file from vector (using Linux API)
write(fd, control_register.data(), control_register.size());
// close file
close(fd);
return 0;
}
Можем ли мы сразу написать набор битов, не используя векторный контейнер?
Комментарии:
1. Невозможно использовать a
std::vector<std::bitset<8>>
эквивалентно вместо astd::vector<uint8_t>
.std::bitset
является ли это собственным классом и отличается отuint8_t
, это только (возможно) базовый тип.2. ваши проблемы начинаются еще до того, как вы вызываете
read
andwrite
.control_register[0].set(1);
неверно, потому что в index0
-> undefined behavior нет элемента3. Почему бы просто не преобразовать его
char
и не записать?bitset
имеет.to_string
и.to_ulong
методы, которые могут вам помочь. Для справки: en.cppreference.com/w/cpp/utility/bitset
Ответ №1:
Что вы можете сделать, так это преобразовать в a std::bitset
перед записью данных. Что-то вроде
std::bitset<8> controlRegister = 0b00101100; // Use some consts and combine them
// with bitwise or (|) to make this more
// human readable
uint8_t ctrl = static_cast<uint8_t>(controlRegister.to_ulong() amp; 0xFF);
write(fd, amp;ctrl , 1);
Комментарии:
1. Спасибо. Я знаю об этой возможности. Но я решил спросить, на случай, если есть альтернативы.