编辑代码

#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;                        //start bit byte position
    startbyte_bitspos=startbit%8u; 
    startbyte_bitsnum=startbit-startbyte*8u+1u;    
    startbyte_bitsnum=(len<startbyte_bitsnum)?len:startbyte_bitsnum;    //bits of start bit byte valid bits number
    /* Special handle for start byte */
    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);
    /* Handle entire bytes */
    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);

    /* Special handle for end byte */
    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;
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
    rtrn = Get_Defined_Bits_Value(Array,7,64);
    printf("rtrn %d\n",rtrn);
    return 0;
}