Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Копирование из массива байт в WORD


Автор: agealex 13.9.2007, 12:45
Желательно использовать memcpy можно и другие варианты

Есть:
Код

1)
//До этого идет очердь в ней хранятся масиивы типа UCHAR
UCHAR  DrvMsg =  qSend.front()   ;
WORD A // - извлеченное значение 

....
2)
int DrvBufRecvSize = 200;
UCHAR * DrvBufferRecv = new UCHAR[DrvBufRecvSize]  ;

WORD B // -  извлеченное значение


В извлеченное значение нужно записать значение из массива, они туда записаны уже до этого, записать WORD В UCHAR [] смог а вынуть не могу

Автор: Fazil6 13.9.2007, 12:55
Код

WORD w = 0;
    unsigned char buf[] = {1,1,4,5,6};
    for(int i = 0; i < sizeof(w); ++i)
    {
        w += buf[i] + 255*i;
    }


Автор: Fazil6 13.9.2007, 13:41
неправильно конечно я написал

Автор: Ln78 13.9.2007, 13:45
Fazil6, я не совсем понял, то ли вместо 
Цитата(Fazil6 @  13.9.2007,  12:55 Найти цитируемый пост)
        w += buf[i] + 255*i;

хотел записать
Код

w += buf[i]<< 8*i;

или какой-то ещё смысл в этой операции?

agealex, твой пример тоже не совсем понял: зависит от того, надо переставлять байты внутри слова или нет (согласованность Big Endian и Little Endian типов), ну и корректно проверить длину входной последовательности, выделять память и т.д. а так - либо простое копирование, либо копирование с перестановкой байт, вроде как ничего особо хитрого нет. Я не понял, что именно тебе нужно: массив байт в массив слов или как-то ещё, или только первые байты, слово всего одно?

Автор: Fazil6 13.9.2007, 13:53
Код

WORD w = 0;
    unsigned char buf[] = { 4,1,4,5,6};
    for(int i = 0; i < sizeof(w); ++i)
    {
         w = w * pow(256,i); 
                   w += buf[i];
    }

первые байты как WORD

Цитата(Ln78 @  13.9.2007,  13:45 Найти цитируемый пост)
или какой-то ещё смысл в этой операции?

такой, тока интерпратация байтов в другом порядке. 
Решил рисануться и фигню спорол...

Автор: Ln78 13.9.2007, 14:03
Цитата(Fazil6 @  13.9.2007,  13:53 Найти цитируемый пост)
 w = w * pow(256,i); 

Опять не понял: зачем так сложно: pow предназначена для операций над вещественными числами, считается довольно долго, смысла её использования в данном случае, ИМХО, не слишком много. Или обычный << слишком прост? smile 

Автор: Fazil6 13.9.2007, 14:10
Цитата(Ln78 @  13.9.2007,  14:03 Найти цитируемый пост)
Или обычный << слишком прост? 

именно!!!

Автор: agealex 13.9.2007, 14:30
Спасибо ксати нашел еще такой вариант  в принцепи тоже самое, но хотелось бы увидеть решить проблему queue.front(); - это указатель но и одновременно и не указатель (указывает на первый элемент первого элемента очерди , но действия как над указателем с ним делать нельзя)
Код

unsigned char buf[] = {1,1,4,5,6};
unsigned char * ad = &buf[0];

WORD SOME =(WORD &)(*(ad));



Добавлено @ 14:37
Нужно просто скоипровать без излишеств, так как я это значение так же просто туда скопирова без выравнивания и другой фигни, просто впал в ступор и никак не мог сделать. А так в массиве(UCHAR) хранятся 2 структуры (я их туда копирую) и есть там переменные типа WORD дак вот мне и надо их от туда скопировать

Автор: agealex 13.9.2007, 15:34
Не нужен именно memcpy или тогда копирование с выравниванием, так как я пишу под виндоус мобайл 5.0 это там не работает

Автор: jonie 13.9.2007, 18:45
буду не оригинальным...
почему бы не использовать что-то
Код

#pragma pack(push)
#pragma pack(1)
typedef union {
 char    _char[sizeof(WORD)];
 WORD word;
}WB;
#pragma pack(pop)

подобное?

если я правильно внял проблему...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)