[CPP]以位流的方式从char数组中读取数据

#include<stdio.h>
#include<stdlib.h>

/*
 * 以位流的方式从char数组中读取读取制定位宽的数据
 * buf    : 以位流的方式储存数据,网络模式存储,big-end
 * start  : 需读取位数据的起始位置,从0开始计数
 * length : 需读取的位宽
 * 返回值 : 以无符号整型的方式返回读到的数据
 * 例如 buf={0x35,0x2e,0xf8,0x53},start=6,length=6,则返回0x12
 */
int BitsToUnsigned(const char* buf,int start,int length)
{
	if(length>((int)sizeof(int))*8) return -1;
	int t0=start/8;
	int t1=start%8;
	int ret=buf[0]&0xFF;
	if(t1!=0) ret=((ret<<t1)&0xFF)>>t1;
	if(length<(8-t1)) ret >>= ((8-t1)-length);
	else
	{
		length -= (8-t1);
		while(length>=8)
		{
			t0++;
			ret = (ret<<8) | (buf[t0]&0xFF);
			length -= 8;
		}
		if(length>0)
		{
			ret <<= length;
			t1 = buf[t0+1]&0xFF;
			t1 >>= (8-length);
			ret |= t1;
		}
	}
	return ret;
}

int main()
{
	char buf[]={0x35,0x2E,0xF8,0x53};
	printf("%X\n",BitsToUnsigned(buf,6,6));
	printf("%X\n",BitsToUnsigned(buf,2,2));
	printf("%X\n",BitsToUnsigned(buf,0,32));
	return 0;
}

你可能感兴趣的:([CPP]以位流的方式从char数组中读取数据)