C++ 矢量数据访问

C++ Vector data access

本文关键字:访问 数据 C++      更新时间:2023-10-16

我有一个字节数组,声明如下:

typedef unsigned char byte;
vector<byte> myBytes = {255, 0 , 76 ...} //individual bytes no larger in value than 255

我遇到的问题是我需要访问向量的原始数据(当然没有任何复制),但我需要为任何给定的元素指针分配任意数量的位

换句话说,我需要将unsigned int分配给向量中的某个位置。

因此,给定上面的例子,我希望执行以下操作:

myBytes[0] = static_cast<unsigned int>(76535); //assign n-bit (here 32-bit) value to any index in the vector

这样矢量数据现在将如下所示:

{2, 247, 42, 1} //raw representation of a 32-bit int (76535)

这可能吗?我有点需要使用向量,只是想知道是否可以以这种方式访问原始数据,或者向量如何存储原始数据是否使这变得不可能或更糟 - 不安全?

提前感谢!

编辑

我不想增加复杂性,但我正在构造不同大小的整数,如下所示:

//**N_TYPES
    u16& VMTypes::u8sto16(u8& first, u8& last) {
    return *new u16((first << 8) | last & 0xffff);
}
u8* VMTypes::u16to8s(u16& orig) {
    u8 first = (u8)orig;
    u8 last = (u8)(orig >> 8);
    return new u8[2]{ first, last };
}

可怕的是,我不确定生成的数字的字节序。但我知道我在任何地方构建和破坏它们都是一样的(我正在编写堆栈机器),所以如果我没记错的话,字节序不会受到我想要做的事情的影响。

编辑 2

我正在以以下可怕的方式构建整数:

u32 a = 76535;
u16* b = VMTypes::u32to16s(a);
u8 aa[4] = { VMTypes::u16to8s(b[0])[0], VMTypes::u16to8s(b[0])[1], VMTypes::u16to8s(b[1])[0], VMTypes::u16to8s(b[1])[1] };

那么这能行得通吗?

memcpy(&_stack[0], aa, sizeof(u32));

是的,这是可能的。您按&myVector[n]获取起始地址,并将int memcpy到该位置。确保保持在矢量的范围内。

反之亦然。把位置和memcpy拿出来到你的int

如建议:通过使用memcpy,您将整数的字节表示复制到向量中。该字节表示形式或字节顺序可能与您的预期不同。关键字有大端序和小端序。

正如 knivil 所说,如果你知道你的系统的字节序,memcpy 就会起作用。但是,如果你想安全,你可以使用按位算术来做到这一点:

unsigned int myInt = 76535;
const int ratio = sizeof(int) / sizeof(byte);
for(int b = 0; b < ratio; b++)
{
    myBytes[b] = byte(myInt >> (8*sizeof(byte)*(ratio - b)));
}

可以使用类似的模式从向量中读出 int,如果你想让我告诉你如何让我知道。