将4字节整数放入向量的前4个char元素中

tzi*_*ppy 5 c++ integer vector bitmask

我有一个,vector<unsigned char>并希望Integer在前4个元素中加上4个字节.在C++中是否有比这样的掩码更简单的方法:

myVector.at(0) = myInt & 0x000000FF;
myVector.at(1) = myInt & 0x0000FF00;
myVector.at(2) = myInt & 0x00FF0000;
myVector.at(3) = myInt & 0xFF000000;
Run Code Online (Sandbox Code Playgroud)

jog*_*pan 11

std::vector保证将A 存储为一个连续的数据块(‡).因此,可以以std::vector<unsigned char>unsigned char缓冲区基本相同的方式处理a .这意味着,只要memcpy您确定数据足够大,就可以将数据放入向量中:

#include <vector>
#include <cstring>
#include <cstdint>

int main()
{
  std::int32_t k = 1294323;
  std::vector<unsigned char> charvec;

  if (charvec.size() < sizeof(k))
    charvec.resize(sizeof(k));

  std::memcpy(charvec.data(), &k, sizeof(k));

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:data()函数std::vector将a返回void*到向量的内部缓冲区.它在C++ 11中可用 - 在早期版本中,可以使用向量的第一个元素的地址&charvec[0].

当然这是一种非常不寻常的使用方式std::vector,并且(由于必要的resize())有点危险.我相信你有充分的理由想要这样做.


(‡)或者,正如标准所说:

(§23.3.6.1/ 1)[...]向量的元素是连续存储的,这意味着如果某个类型vvector<T, Allocator>地方T不是bool,那么它就是服从身份的

       &v[n] == &v[0] + n for all 0 <= n < v.size().
Run Code Online (Sandbox Code Playgroud)


Gui*_*i13 4

您必须对您的值进行二进制转换才能使其工作:

myVector.at(0) = (myInt & 0xFF);
myVector.at(1) = (myInt >> 8) & 0xFF;
myVector.at(2) = (myInt >> 16) & 0xFF;
myVector.at(3) = (myInt >> 24) & 0xFF;
Run Code Online (Sandbox Code Playgroud)

你的代码是错误的:

int myInt = 0x12345678;
myVector.at(0) = myInt & 0x000000FF; // puts 0x78 
myVector.at(1) = myInt & 0x0000FF00; // tries to put 0x5600 but puts 0x00
myVector.at(2) = myInt & 0x00FF0000; // tries to put 0x340000 but puts 0x00
myVector.at(3) = myInt & 0xFF000000; // tries to put 0x12000000 but puts 0x00
Run Code Online (Sandbox Code Playgroud)