Чтение / запись API Linux и набор битов c

#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>> эквивалентно вместо a std::vector<uint8_t> . std::bitset является ли это собственным классом и отличается от uint8_t , это только (возможно) базовый тип.

2. ваши проблемы начинаются еще до того, как вы вызываете read and write . control_register[0].set(1); неверно, потому что в index 0 -> 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. Спасибо. Я знаю об этой возможности. Но я решил спросить, на случай, если есть альтернативы.