繁体   English   中英

将成员变量复制到字节向量中

[英]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;
}

如果要使用其他类型结构的字节,则可以使用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;

}

不幸的是,您要求提供一种解决方案,但我认为这是不可行的。

正如其他人已经指出的那样,您错在哪里,有一个单一的解决方案令人难以置信。

首先,您需要确保向量的大小足以接收8个字节。 像这样:

data_out.resize(8);

您可以执行reinterpret_cast强制编译器将向量中的这8个字节解释为8个字节的唯一类型,然后执行复制操作

*(reinterpret_cast<uint64_t*>(data_out.data())) = eight_bytes_data;

我无法弄清楚出现问题的所有可能性。 因此,使用风险自负。

如果您对更通用的版本感兴趣:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM