将成员变量复制到字节向量中
copy member variable into byte vector
我想将一个64位成员变量逐字节复制到向量中。
请避免告诉我使用位运算来提取每个字节,然后将它们复制到向量中。
我只想说一句话。
我使用memcpy和copy方法,但它们都失败了。
这是示例代码:
#include <iostream>
#include <vector>
#include <cstdint>
#include <cstring>
using namespace std;
class A {
public:
A()
: eight_bytes_data(0x1234567812345678) {
}
void Test() {
vector<uint8_t> data_out;
data_out.reserve(8);
memcpy(data_out.data(),
&eight_bytes_data,
8);
cerr << "[Test]" << data_out.size() << endl;
}
void Test2() {
vector<uint8_t> data_out;
data_out.reserve(8);
copy(&eight_bytes_data,
(&eight_bytes_data) + 8,
back_inserter(data_out));
cerr << "[Test2]" << data_out.size() << endl;
for (auto value : data_out) {
cerr << hex << value << endl;
}
}
private:
uint64_t eight_bytes_data;
};
int main() {
A a;
a.Test();
a.Test2();
return 0;
}
正如其他人已经展示的那样,有一个单行解决方案是危险的。
首先,您需要确保向量有足够的大小来接收8个字节。类似这样的东西:
data_out.resize(8);
您可以执行interpret_cast,强制编译器将向量中的8个字节解释为8个字节的唯一类型,并复制
*(reinterpret_cast<uint64_t*>(data_out.data())) = eight_bytes_data;
我想不出出出问题的所有可能性。因此,使用时风险自负。
如果您想使用另一种类型结构的字节,可以使用char*来操作每个字节:
void Test3()
{
vector<uint8_t> data_out;
char* pbyte = (char*)&eight_bytes_data;
for(int i = 0; i < sizeof(eight_bytes_data); ++i)
{
data_out.push_back(pbyte[i]);
}
cerr << "[Test]" << data_out.size() << endl;
}
不幸的是,您要求一个单线解决方案,我认为这是不可行的。
如果您对更通用的版本感兴趣:
namespace detail
{
template<typename Byte, typename T>
struct Impl
{
static std::vector<Byte> impl(const T& data)
{
std::vector<Byte> bytes;
bytes.resize(sizeof(T)/sizeof(Byte));
*(T*)bytes.data() = data;
return bytes;
}
};
template<typename T>
struct Impl<bool, T>
{
static std::vector<bool> impl(const T& data)
{
std::bitset<sizeof(T)*8> bits(data);
std::string string = bits.to_string();
std::vector<bool> vector;
for(const auto& x : string)
vector.push_back(x - '0');
return vector;
}
};
}
template<typename Byte = uint8_t,
typename T>
std::vector<Byte> data_to_bytes(const T& data)
{
return detail::Impl<Byte,T>::impl(data);
}
int main()
{
uint64_t test = 0x1111222233334444ull;
for(auto x : data_to_bytes<bool>(test))
std::cout << std::hex << uintmax_t(x) << " ";
std::cout << std::endl << std::endl;
for(auto x : data_to_bytes(test))
std::cout << std::hex << uintmax_t(x) << " ";
std::cout << std::endl << std::endl;
for(auto x : data_to_bytes<uint16_t>(test))
std::cout << std::hex << uintmax_t(x) << " ";
std::cout << std::endl << std::endl;
for(auto x : data_to_bytes<uint32_t>(test))
std::cout << std::hex << uintmax_t(x) << " ";
std::cout << std::endl << std::endl;
for(auto x : data_to_bytes<uint64_t>(test))
std::cout << std::hex << uintmax_t(x) << " ";
std::cout << std::endl << std::endl;
}
输出:
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1
0 0 0 1 0 0 0 1 0 0 0 1 0 0
44 44 33 33 22 22 11 11
4444 3333 2222 1111
33334444 11112222
1111222233334444
相关文章:
- 使用 swig 追加到字节数组
- 从向量到空指针的 memcpy(反之亦然)不起作用
- OBJ 向量到成员函数
- Ascii .txt文件到字节数组 - C++
- 使用指针向量到参考向量是非法的吗?
- 将 CByteArray 复制到字节数组中会导致访问冲突
- 将HICON / HCURSOR复制到字节数组中
- 将 QImage 保存到字节数组
- 如何将数据复制到字节数组的某些部分
- 将数据流到字节数组中
- 从函数填充的字符串的推导向量到 int 的字符串
- 如何将任何值转换为字节数组并将其附加到字节列表
- 在内存级别重新解释向量的字节
- 以C++(Arduino)为单位比较指针到字节
- 字符串向量到istringstream
- 将共享_ptr的向量转换为shared_ptr的向量到const
- 如何有效地对__m256i向量的字节进行重新排序(将int32_t转换为uint8_t)?
- 将结构添加到字节向量,然后添加另一个
- 字节向量到十六进制字符串流 DWORD 对齐
- 将成员变量复制到字节向量中