2016-02-29 119 views
1

我有一个字节数组,声明像这样:C++矢量数据访问

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 }; 
} 

有什么可怕的这件事,是我不知道的生成的数字的字节序。但是我知道我正在构建和破坏它们(我正在编写一个堆栈机器),所以如果我没有弄错,排序不会受到我正在尝试做的事情的影响。

EDIT 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)); 
+1

另外不要忘记观看未对齐的访问。 –

+0

@LogicStuff是的,但你的评论是无益的。 SuperCookie,new用于动态内存分配并返回一个指针;更好地让矢量为你管理内存。 – Straw1239

+0

这里的重点是如果你的系统是小端或大端。根据你的系统,字节的顺序应该颠倒过来。 – mustafagonul

回答

2

是的,这是可能的。你的起始地址是&myVector[n]memcpy你的int到那个位置。确保你留在你的载体的边界。

另一种方法也适用。请将位置和memcpy排除在您的int之外。

建议:通过使用memcpy您将复制您的整数的字节表示到矢量中。该字节表示或字节顺序可能与您的期望不同。关键词大而小端。

+1

任何永久性可移植性问题? –

+0

谢谢你的回答,这似乎是最适用的。根据我所做的两个编辑,您是否认为endianness会成为我的一个问题,将此方法与我的整数构造和解码函数结合使用? – SolaGratia

+0

这取决于你为什么需要原始访问或以这种方式构建整数。如果你的数据保持在同一台机器上,那么就不会有任何区别。如果是序列化,你应该选择小序列或大序列。正确实施序列化功能,以便读取或写入时转换值。 – knivil

0

正如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可以读出使用了类似的模式,矢量:但是,如果你想成为安全的,可以按位运算做到这一点。

+1

不应该是'CHAR_BIT',那些幻数是'sizeof'表达式;) –

+1

@JamesRoot是的。我修复它。 – Straw1239

+0

@JamesRoot看到我重新编辑的问题哈哈 – SolaGratia