Nếu bạn muốn lớp bitet hỗ trợ tốt nhất chuyển đổi thành nhị phân và bitet của bạn lớn hơn kích thước của unsigned long, thì tùy chọn tốt nhất để sử dụng là boost::dynamic_bitset. (Tôi đoán nó là hơn 32 và thậm chí 64 bit nếu bạn lo ngại về tiết kiệm không gian).
Từ dynamic_bitset bạn có thể sử dụng to_block_range để ghi các bit vào loại tích phân cơ bản. Bạn có thể xây dựng lại dynamic_bitset từ các khối bằng cách sử dụng from_block_range hoặc hàm tạo của nó từ BlockInputIterator hoặc bằng cách thực hiện các hàm append().
Bây giờ bạn có các byte ở định dạng gốc của chúng (Chặn) bạn vẫn gặp sự cố khi ghi nó vào luồng và đọc lại.
Trước tiên, bạn cần phải lưu trữ một chút thông tin "tiêu đề": số lượng khối bạn có và có khả năng là kết thúc.Hoặc bạn có thể sử dụng macro để chuyển đổi thành chuẩn endianness (ví dụ: ntohl nhưng bạn sẽ sử dụng lý tưởng macro là no-op cho nền tảng phổ biến nhất của bạn, vì vậy nếu đó là nhỏ, bạn có thể muốn lưu trữ theo cách đó và chỉ chuyển đổi hệ thống lớn-endian).
(Lưu ý: Tôi giả định rằng tăng :: dynamic_bitset tiêu chuẩn chuyển đổi các loại không tách rời theo cùng một cách bất kể endianness cơ bản. Tài liệu của họ không nói).
Để viết số nhị phân vào luồng sử dụng os.write(&data[0], sizeof(Block) * nBlocks)
và để sử dụng là đọc. read(&data[0], sizeof(Block) * nBlocks)
nơi dữ liệu được giả định là vector<Block>
và trước khi đọc, bạn phải làm data.resize(nBlocks)
(không phải reserve()
). (Bạn cũng có thể làm những thứ kỳ lạ với istream_iterator
hoặc istreambuf_iterator
nhưng thay đổi kích thước() có lẽ tốt hơn).
Thực ra tôi không quan tâm rằng nó lưu trữ từng bit như một byte trong câu hỏi của tôi ... nó chỉ được diễn đạt một cách mơ hồ. Câu hỏi tiếp theo tốt. –