2016-02-29 2 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) 

Возможно ли это? Мне как-то нужно использовать вектор, и мне просто интересно, можно ли получить доступ к необработанным данным таким образом или делать, как вектор хранит необработанные данные, делает это невозможным или худшим - небезопасным?

Заранее благодарен!

EDIT

Я не хочу, чтобы добавить сложность, но я построение разного размера целого числа следующим образом:

//**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] и memcpyint в это место. Убедитесь, что вы остаетесь в пределах вашего вектора.

Другой способ работы тоже. Возьмите место и memcpy из вашего int.

Как предложено: с помощью memcpy вы скопируете представление байта вашего целого в вектор. Это представление байта или порядок байтов может отличаться от вашего ожидания. Ключевые слова большие и малочисленные.

+1

Проблемы с переносимостью endianess? –

+0

Благодарим вас за ответ, он кажется наиболее подходящим. В свете двух изменений, которые я сделал, вы думаете, что энтузиазм будет для меня проблемой, используя этот метод в сочетании с моими целыми функциями построения и декодирования? – SolaGratia

+0

Это зависит от того, зачем вам нужен необработанный доступ или построение целых чисел таким образом. Если ваши данные остаются на одной машине, тогда не было бы никакой разницы. Если это для сериализации, вы должны выбрать маленький или большой endian. Внедрите свою функцию сериализации правильно, чтобы значения были преобразованы при чтении или записи. – 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))); 
} 

ИНТ может быть считан из вектора с использованием той же модели, если вы хотите, чтобы я показал вам, как, дайте мне знать.

+1

Не должно быть 8 символов CHAR_BIT, а те магические числа - выражения 'sizeof';) –

+1

@JamesRoot Да. Я исправлю это. – Straw1239

+0

@JamesRoot Посмотреть мой отредактированный вопрос lol – SolaGratia

Смежные вопросы