ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
8 мая
53205 Топик полностью
Romario (07.03.2006 19:18, просмотров: 1) ответил ReAl на sz на входе произвольное?
нет конечно, макс 256 байт. для упакованных это будет 224. ну вот енкодер если что (без goto:)) 

/******************************************************************************
 * DESCRIPTION:
 * 
 * 0:0aaaaaaa 1:0bbbbbbb 2:0ccccccc 3:0ddddddd 4:0eeeeeee 5:0fffffff 6:0ggggggg  7:0hhhhhhh
 * 0:aaaaaaab 1:bbbbbbcc 2:cccccddd 3:ddddeeee 4:eeefffff 5:ffgggggg 6:ghhhhhhh
 *****************************************************************************/
u16_t Pack7bData(u8_t InBuf[],u16_t _sz) {
  
 REG_t u32_t lw1         ;
 REG_t u32_t lw2         ;
 REG_t u8_t  *src = InBuf;
 REG_t u8_t  *dst = InBuf;
       u16_t rsz  = _sz  ;
       u16_t tsz  = 0    ;

  while(1) {
	 //  0aaaaaaa 0bbbbbbb 0ccccccc 0ddddddd
	 //  aaaaaaab bbbbbbcc cccccddd ddddxxxx
	 //  ******* first 4 bytes *********
	 lw1  =  ((u32_t)*src++ << 25); 
	 lw1 |=  ((u32_t)*src++ << 18);
	 lw1 |=  ((u32_t)*src++ << 11);
	 lw1 |=  ((u32_t)*src++ << 4 );

	 //  ******* second 4 bytes *********
     //  0eeeeeee 0fffffff 0ggggggg 0hhhhhhh
	 //  eeefffff ffgggggg ghhhhhhh xxxxxxxx
	 lw1 |=  *src >> 3;
	 lw2  =  ((u32_t)*src++ << 29); 
	 lw2 |=  ((u32_t)*src++ << 22);
	 lw2 |=  ((u32_t)*src++ << 15);
	 lw2 |=  ((u32_t)*src++ << 8 );
	 
	 if (rsz < 8) {
	   break;
	 }

	 ST_U32PI(dst,lw1)         ;
	 *dst++ = (u8_t)(lw2 >> 24);
     *dst++ = (u8_t)(lw2 >> 16);
     *dst++ = (u8_t)(lw2 >> 8 );

	 rsz -= 8;
	 tsz += 7;
  }

  // shift pad in lw1 & lw2
  // --------------- lw1 --------------- --------------- lw2 ---------------
  // 0:       1:       2:       3:       4:       5:       6:        7:
  // 00000001 11111122 22222333 33334444 44455555 55666666 67777777  xxxxxxxx
  tsz += rsz;
  while (rsz) {
     *dst++ = (u8_t)(lw1 >> 24);
	 lw1  <<= 8;
	 lw1   |= (u8_t)(lw2 >> 24);
	 lw2  <<= 8;
	 rsz--;
  }
	 
  return tsz;

}