2016-02-29 122 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