16,548
社区成员




unsigned char b[16];
for(int i=0;i<16;i++)
{
b[i]=0;
for(int j=0;j<8;j++)
{
b[i]|=(bits[i*8+j])<<j;
}
}
}
union BIT128
{
struct
{
DWORD a:9;
DWORD b:1;
DWORD c:1;
DWORD d:1;
DWORD e:4;
DWORD f:9;
DWORD g:5;
DWORD h:10;
DWORD i:8;
DWORD j:8;
DWORD k:8;
DWORD l:16;
DWORD m:16;
DWORD n:32;
};
BYTE data[16];
};
BIT128 *p=(BIT128 *)pData; //假设pData为你传递进去的unsigned char [0x10];
//取变量a: p->a
//取变量b: p->b
#include <bitset>
/**
* 返回 uchar[16]总共128位的从nPosBegin开始位到nPosEnd结束位的数
*/
unsigned long GetBitNumber( unsigned char uchar[16],int nPosBegin,int nPosEnd )
{
/**
* 把你的uchar[16]转化到bitset<128>中
*/
using namespace std;
std::bitset< 128 > bit128 ;
for( long i = 0;i<16;i ++ )
{
std::bitset< 8 > bit8( uchar[i] );
for( long j = 0;j<8;j ++ )
{
bit128[i * 8 + j ] = bit8[j];
}
}
/**
* 把对应位返回到bitReturn中
*/
std::bitset< 32 > bitReturn;
for( long i = nPosBegin;i<= nPosEnd ;i++ )
{
bitReturn[ i - nPosBegin ] = bit128[i];
}
/**
* 返回结果
*/
return bitReturn.to_ulong();
}
BYTE byte16[ 16 ] ={ 0xE1,0xEF,0xCD };
int a = GetBitNumber( byte16,0,8 );
BYTE b = GetBitNumber( byte16,9,9 );
DWORD GetVariable(unsigned char *lpData, int nPos, int nBitCount)
{
DWORD dwTemp[2]={0};//因有可能跨DWORD的边界,用两个双字来存储临时数据
DWORD dwData=0; //存储变量值
DWORD dwMask=0;
int dwPos=nPos/32; //变量位于第几个双字
int bitPos=nPos%32; //在该双字中的位置
LPDWORD pCursor=(LPDWORD)(lpData+dwPos); //定位到所在的双字
DWORD dwLength=bitPos+nBitCount; //计算是否超出双字的边界
dwTemp[0]=*pCursor;
if(dwLength>32) //所取的变量跨DWORD的边界
{
int nBitLeft=dwLength-32; // 下一个双字掩码所需的位数
nBitCount-=nBitLeft; // 当前双字掩码所需的位数
dwTemp[1]=*(pCursor+1);
dwMask=(1<<nBitLeft)-1; //根据所需的位数和所处的位置生成掩码
dwData=dwTemp[1]&dwMask;
dwData<<=nBitCount; //移位
}
dwMask=((1<<nBitCount)-1)<<bitPos; //根据所需的位数和所处的位置生成掩码
dwData|=(dwTemp[0]&dwMask)>>bitPos;
return dwData;
}
int main()
{
static int nBitCount[]={9,1,1,1,4,9,5,10,8,8,8,16,16,32};//各变量占的位数
int nPos[14]; //保存各变量的位置
int i;
//初始化各变量所在位置
nPos[0]=0;
for(i=1;i<sizeof(nBitCount)/sizeof(nBitCount[0]);i++)
{
nPos[i]=nPos[i-1]+nBitCount[i-1]; //各变量的位置
}
DWORD dwH=GetVariable(aa.data, nPos[7], nBitCount[7]); //假设取h: 序号从0起始
return 0L;
}
union MyFlag
{
unsigned char uchar[10]; // 8 * 10 = 80, 参数位数可能不够
DWORD dwFlag[4]; // 32 * 4 = 128
};