нет конечно, макс 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;
}