ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
8 мая
53211 Топик полностью
ReAl (07.03.2006 19:53, просмотров: 1) ответил ReAl на А!!! Так это же ниагарский водопад!!!
(ччёрт, enter не вовремя нажал) - в смысле классическая (в некотором смысле "типовая" - см соседний тред "без претензии на флейм") конструкция switch/do-while 
#include 

/******************************************************************************
 * DESCRIPTION:
 *
 * 0:aaaaaaab 1:bbbbbbcc 2:cccccddd 3:ddddeeee 4:eeefffff 5:ffgggggg 6:ghhhhhhh *7:aaaaaaa0
 * 0:0aaaaaaa 1:0bbbbbbb 2:0ccccccc 3:0ddddddd 4:0eeeeeee 5:0fffffff 6:0ggggggg  7:0hhhhhhh *8:0aaaaaaa

 * 0:aaaaaaab 1:bbbbbbcc 2:cccccddd 3:ddddeeee 4:eeefffff 5:ffgggggg 6:g-------
 * 0:0aaaaaaa 1:0bbbbbbb 2:0ccccccc 3:0ddddddd 4:0eeeeeee 5:0fffffff 6:0ggggggg
 *       1           2          3           4          5        6          7
 *****************************************************************************/
void UnPack7bData(uint8_t InBuf[], uint16_t sz)
{

	uint8_t *src = InBuf;
	uint8_t *dst = InBuf;
	uint16_t i, j;

	i = sz >> 3;
	dst += sz - 1;		// dst
	src += (j = sz - i - 1);	// src
	i = (i + j) & 7;

	switch(i) {
		do {
	case 7:		// src = 6:ghhhhhhh
			*dst-- = *src & 0x7f;
	case 6:		// src = 5:ffgggggg 6:ghhhhhhh
			*dst-- = (((*(src - 1)) << 1) & 0x7F) + (*src >> 7);
			src--;
	case 5:		// src = 4:eeefffff 5:ffgggggg
			*dst-- = (((*(src - 1)) << 2) & 0x7F) + (*src >> 6);
			src--;
	case 4:		// src = 3:ddddeeee  4:eeefffff
			*dst-- = (((*(src - 1)) << 3) & 0x7F) + (*src >> 5);
			src--;
	case 3:		// src = 2:cccccddd  3:ddddeeee
			*dst-- = (((*(src - 1)) << 4) & 0x7F) + (*src >> 4);
			src--;
	case 2:		// src = 1:bbbbbbcc  2:cccccddd
			*dst-- = (((*(src - 1)) << 5) & 0x7F) + (*src >> 3);
			src--;
	case 1:		// src = 0:aaaaaaab  1:bbbbbbcc
			*dst-- = (((*(src - 1)) << 6) & 0x7F) + (*src >> 2);
			src--;
	case 0:		// src = 0:aaaaaaab
			*dst-- = *src >> 1;
		} while( src-- != InBuf);
	}	
}