Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование из массива байт в WORD, как это сделать? 
:(
    Опции темы
agealex
Дата 13.9.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Желательно использовать memcpy можно и другие варианты

Есть:
Код

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

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

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


В извлеченное значение нужно записать значение из массива, они туда записаны уже до этого, записать WORD В UCHAR [] смог а вынуть не могу
PM MAIL   Вверх
Fazil6
Дата 13.9.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

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


PM MAIL   Вверх
Fazil6
Дата 13.9.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



неправильно конечно я написал
PM MAIL   Вверх
Ln78
Дата 13.9.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



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

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

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

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

agealex, твой пример тоже не совсем понял: зависит от того, надо переставлять байты внутри слова или нет (согласованность Big Endian и Little Endian типов), ну и корректно проверить длину входной последовательности, выделять память и т.д. а так - либо простое копирование, либо копирование с перестановкой байт, вроде как ничего особо хитрого нет. Я не понял, что именно тебе нужно: массив байт в массив слов или как-то ещё, или только первые байты, слово всего одно?
PM MAIL   Вверх
Fazil6
Дата 13.9.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

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 Найти цитируемый пост)
или какой-то ещё смысл в этой операции?

такой, тока интерпратация байтов в другом порядке. 
Решил рисануться и фигню спорол...
PM MAIL   Вверх
Ln78
Дата 13.9.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



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

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

PM MAIL   Вверх
Fazil6
Дата 13.9.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

именно!!!
PM MAIL   Вверх
agealex
Дата 13.9.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Спасибо ксати нашел еще такой вариант  в принцепи тоже самое, но хотелось бы увидеть решить проблему 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:12
PM MAIL   Вверх
agealex
Дата 13.9.2007, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) agealex - 13.9.2007, 17:59
PM MAIL   Вверх
jonie
Дата 13.9.2007, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



буду не оригинальным...
почему бы не использовать что-то
Код

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

подобное?

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.