У меня есть массив байт, объявленный следующим образом: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));
Также не забывайте о наблюдении за неприсоединением доступа. –
@LogicStuff Да, но ваш комментарий бесполезен. SuperCookie, new используется для динамического выделения памяти и возвращает указатель; лучше, чтобы вектор управлял памятью для вас. – Straw1239
Важным моментом здесь является то, что ваша система имеет немного конца или большой конец. Последовательность байтов должна быть отменена, может быть, в соответствии с вашей системой. – mustafagonul