(ччёрт, 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);
}
}