我有一个vector<unsigned char>
,并希望将4个字节Integer
放入前4个元素中。
在C ++中是否有比这样的掩码更简单的方法:
myVector.at(0) = myInt & 0x000000FF;
myVector.at(1) = myInt & 0x0000FF00;
myVector.at(2) = myInt & 0x00FF0000;
myVector.at(3) = myInt & 0xFF000000;
答案 0 :(得分:11)
保证std::vector
存储为一个连续的数据块(‡)。因此,可以以与std::vector<unsigned char>
缓冲区基本相同的方式处理unsigned char
。这意味着,只要您确定数据足够大,就可以将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;
}
注意:data()
std::vector
函数会将void*
返回到向量的内部缓冲区。它在C ++ 11中可用 - 在早期版本中,可以使用向量的第一个元素的地址&charvec[0]
。
当然,这是使用std::vector
的一种非常不寻常的方式,并且(由于必要的resize()
)有点危险。我相信你有充分的理由想要这样做。
(‡)或者,正如标准所说:
(§23.3.6.1/ 1)[...]向量的元素是连续存储的,这意味着如果
v
是vector<T, Allocator>
,其中T
是某种类型的其他类型比bool
,然后它服从身份&v[n] == &v[0] + n for all 0 <= n < v.size().
答案 1 :(得分:3)
你必须二进制移动你的值才能发挥作用:
myVector.at(0) = (myInt & 0xFF);
myVector.at(1) = (myInt >> 8) & 0xFF;
myVector.at(2) = (myInt >> 16) & 0xFF;
myVector.at(3) = (myInt >> 24) & 0xFF;
你的代码错了:
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
答案 2 :(得分:3)
你可以做类似以下的事情:
#include <vector>
#include <cstdio>
void
insert_int(std::vector<unsigned char>* container, int integer)
{
char* chars = reinterpret_cast<char*>(&integer);
container->insert(container->end(), chars, chars+sizeof(int));
}
int main(void)
{
std::vector<unsigned char> test_vector;
int test_int = 0x01020304;
insert_int(&test_vector, test_int);
return 0;
}
只记得要考虑到忍耐力。我的机器以相反的顺序打印int。
4,3,2,1
答案 3 :(得分:1)
您的解决方案不正确,因为您目前拥有它。类似的东西:
std::vector<unsigned char> v(sizeof(int));
int myInt = 0x12345678;
for(unsigned i = 0; i < sizeof(int); ++i) {
v[i] = myInt & 0xFF;
myInt >>= 8;
}
应该有效。它也更具可移植性(不假设int
是4个字节)。
答案 4 :(得分:1)
这是最紧凑的方式:
myVector.at(0) = *((char*)&myInt+0);
myVector.at(1) = *((char*)&myInt+1);
myVector.at(2) = *((char*)&myInt+2);
myVector.at(3) = *((char*)&myInt+3);