#include <stdio.h>
unsigned char Array[16]={253,2,3,4,0x57,6,7,8,1,2,3,4,0x57,6,39,8};
unsigned long Get_Defined_Bits_Value(unsigned char *data,unsigned short startbit, unsigned char len);
unsigned long Get_Defined_Bits_Value(unsigned char *data,unsigned short startbit, unsigned char len)
{
unsigned char startbyte=0u;
unsigned char startbyte_bitsnum=0u;
unsigned char startbyte_bitspos=0u;
unsigned char current_bits_unhdl=0u;
unsigned char bytes_index=0;
unsigned char Temp_Value=0;
unsigned char MSK_BITS=0;
unsigned char MSK_BITS_L=0;
unsigned char MSK_BITS_R=0;
unsigned long rtrn_value=0u;
startbyte=startbit/8u;
startbyte_bitspos=startbit%8u;
startbyte_bitsnum=startbit-startbyte*8u+1u;
startbyte_bitsnum=(len<startbyte_bitsnum)?len:startbyte_bitsnum;
bytes_index=startbyte;
MSK_BITS_L=8u-(startbyte_bitspos+1u);
MSK_BITS_R=startbyte_bitspos+1u-startbyte_bitsnum;
MSK_BITS=MSK_BITS_L&MSK_BITS_R;
rtrn_value=(unsigned long)(((unsigned char)(data[bytes_index]<<MSK_BITS_L))>>(MSK_BITS_L+MSK_BITS_R));
printf("rtrn_value %d\n",rtrn_value);
printf("startbyte_bitsnum %d\n",startbyte_bitsnum);
printf("startbyte_bitspos %d\n",startbyte_bitspos);
printf("MSK_BITS_L %d\n",MSK_BITS_L);
printf("MSK_BITS_R %d\n",MSK_BITS_R);
printf("MSK_BITS %d\n",MSK_BITS);
current_bits_unhdl=len-startbyte_bitsnum;
printf("current_bits_unhdl %d\n",current_bits_unhdl);
while(current_bits_unhdl>=8u)
{
bytes_index++;
rtrn_value=(rtrn_value<<8u)|(unsigned long)data[bytes_index];
current_bits_unhdl=current_bits_unhdl-8u;
printf("rtrn_value %d\n",rtrn_value);
}
printf("current_bits_unhdl %d\n",current_bits_unhdl);
if( current_bits_unhdl>0 )
{
bytes_index++;
printf("bytes_index %d\n",bytes_index);
Temp_Value=(data[bytes_index]&((0xFFu<<(8u-current_bits_unhdl))>>(8u-current_bits_unhdl)))>>(8u-current_bits_unhdl);
printf("Temp_Value %d\n",Temp_Value);
rtrn_value=(rtrn_value<<current_bits_unhdl)|Temp_Value;
}
return rtrn_value;
}
int main () {
unsigned long rtrn;
rtrn = Get_Defined_Bits_Value(Array,7,64);
printf("rtrn %d\n",rtrn);
return 0;
}