我如何将bitset转换为字节/uint8数组
How do I convert bitset to array of bytes/uint8?
我需要从bitset中提取字节,bitset可能(不)包含CHAR_BIT位的多个。我现在知道需要把bitset中的多少位放入数组中。例如,
位集声明为std::bitset < 40> id;
有一个单独的变量nBits
, id
中有多少位是可用的。现在我想以CHAR_BIT的倍数提取这些位。我还需要注意nBits % CHAR_BIT != 0
。我可以将其放入uint8
您可以使用boost::dynamic_bitset,它可以使用boost::to_block_range转换为"块"的范围。
#include <cstdlib>
#include <cstdint>
#include <iterator>
#include <vector>
#include <boost/dynamic_bitset.hpp>
int main()
{
typedef uint8_t Block; // Make the block size one byte
typedef boost::dynamic_bitset<Block> Bitset;
Bitset bitset(40); // 40 bits
// Assign random bits
for (int i=0; i<40; ++i)
{
bitset[i] = std::rand() % 2;
}
// Copy bytes to buffer
std::vector<Block> bytes;
boost::to_block_range(bitset, std::back_inserter(bytes));
}
不幸的是,在语言中没有好的方法,假设您需要超过unsigned long
中的位数(在这种情况下您可以使用to_ulong
)。您必须遍历所有位并自己生成字节数组。
使用标准c++ 11,您可以通过移位和屏蔽从40位bitset
中获得字节。我没有处理不同的值,而不是8和40,以及当第二个数字不是第一个数字的倍数时的处理。
#include <bitset>
#include <iostream>
#include <cstdint>
int main() {
constexpr int numBits = 40;
std::bitset<numBits> foo(0x1234567890);
std::bitset<numBits> mask(0xff);
for (int i = 0; i < numBits / 8; ++i) {
auto byte =
static_cast<uint8_t>(((foo >> (8 * i)) & mask).to_ulong());
std::cout << std::hex << setfill('0') << setw(2) << static_cast<int>(byte) << std::endl;
}
}
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从值小于256的uint16到uint8的Endian安全转换
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 在java中读取c++字节的位字段
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 字节真的是最小可寻址单元吗
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 将 UInt8 C++值转换为 C# 字节数组
- 在C++中使用什么来进行uint8或char的字节操作
- Jagged Uint8数组转换为C#字节
- 我如何将bitset转换为字节/uint8数组
- 转换uint8字节数组到任何WPF渲染对象