Непременно на С? (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено cout 20 октября 2003 г. 13:23
В ответ на: Хочется красиво упаковать 16 10-битных слов в в массив из 10 unsugned int, отправлено VVT 20 октября 2003 г. 11:50


/********************************/
unsigned int SourceArray[16] = /* пример */
{
0x0012, 0x0123, 0x0234, 0x0345,
0x0123, 0x0234, 0x0345, 0x0012,
0x0234, 0x0345, 0x0012, 0x0123,
0x0345, 0x0012, 0x0123, 0x0234
};
union My {
unsigned char CharZipArray[20]; /* здесь будет упакованный массив */
unsigned int IntZipArray[10]; /* тот же упакованный массив как 10 unsigned int. Как просили */
}Place;
/********************************/
/********************************/
/* Функция запакует указанный элемент входного массива из 16-ти десятиразрядных чисел в */
/* выходной массив 20 байт. Описание выходного массива: */
/* первые 16 байт - соотв. младшие байты вх. массива. Последние 4 байта есть упакованные */
/* пары бит (2х16=32) */
void Zip(unsigned char j)
{
unsigned char job;
unsigned int work;
unsigned char* ptr1;
unsigned long* ptr2;

j &= 0x0f;
/* взять младший байт j-того элемента */
work = SourceArray[ j ];
ptr1 = (unsigned char*)(&work);
/* поместить в выходной массив на свое место */
Place.CharZipArray[ j ] = (*ptr1);
/* представление 4-х байт как unsigned long */
ptr2 = (unsigned long*)(&(Place.CharZipArray[16]));
ptr1++; /* доступ к старшему байту work'а */
job = *ptr1;
job &= 0x03;
/* размещение старших бит */
(*ptr2) |= (((unsigned long)job)<<(j*2));
}
/********************************/

/* Вызов */
Zip( 0 );
Zip( 1 );
Zip( 2 );
Zip( 3 );
Zip( 15 );


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru