输入:字符数组,数组长度
输出:32位整形有符号数
用例:
char x[4];
x[0]='E';
x[1]='F';
x[2]='F';
x[3]='F';
代码:
int32_tHex2Int32(char* x ,int8_t lenth){int32_t y =0;int8_t t=1;//符号位for(int i = lenth -1; i >=0;i--){if(x[i]>='0'&& x[i]<='9'){
y=y*16+x[i]-'0';}elseif(x[i]>='a'&& x[i]<='f'){
y=y*16+x[i]+10-'a';}elseif(x[i]>='A'&& x[i]<='F'){
y=y*16+x[i]+10-'A';}if( i == lenth -1&& y >=8){//符号位
t =-1;
y -=8;//最高位是符号,不算值}}return t <0? y -32768: y;}
2. motorola编码
输入:startBit,bitLength,编码对应变量,编码byte数组
输出:无
voidMotorola_Code(uint8_t startBit ,uint8_t bitLength ,uint32_t val ,uint8_t* buf){int row, col ;
row = startBit /8;
col = startBit %8;for(int i =0; i < bitLength ; i ++){
buf[row]|=( val &0x01u)<< col;
val = val>>1;
col++;if(col >7){
col =0;
row--;}}}
3.motorola解码(有待验证)
voidMotorola_DeCode(uint8_t startBit ,uint8_t bitLength ,uint32_t val ,uint8_t* buf){int row, col ,bit;
row = startBit /8;
col = startBit %8;for(int i =0; i < bitLength ; i ++){
bit =(buf[row]&(0x01u<< col));
val |=(bit << i);
col++;if(col >7){
col =0;
row--;}}}
二、收集的
1. 字节数组按位取32位数
/* extract unsigned/signed bits ------------------------------------------------
* extract unsigned/signed bits from byte data
* args : uint8_t *buff I byte data
* int pos I bit position from start of data (bits)
* int len I bit length (bits) (len<=32)
* return : extracted unsigned/signed bits
*-----------------------------------------------------------------------------*/uint32_tgetbitu(constuint8_t* buff,int pos,int len){uint32_t bits =0;int i;for(i = pos; i < pos + len; i++) bits =(bits <<1)+((buff[i /8]>>(7- i %8))&1u);return bits;}int32_tgetbits(constuint8_t* buff,int pos,int len){uint32_t bits =getbitu(buff, pos, len);if(len <=0||32<= len ||!(bits &(1u<<(len -1))))return(int32_t)bits;return(int32_t)(bits |(~0u<< len));/* extend sign */
2. 32位数按位放入字节数组
externvoidsetbitu(uint8_t* buff,int pos,int len,uint32_t data){uint32_t mask =1u<<(len -1);int i;if(len <=0||32< len)return;for(i = pos; i < pos + len; i++, mask >>=1){if(data & mask) buff[i /8]|=1u<<(7- i %8);else buff[i /8]&=~(1u<<(7- i %8));}}externvoidsetbits(uint8_t* buff,int pos,int len,int32_t data){if(data <0) data |=1<<(len -1);else data &=~(1<<(len -1));/* set sign bit */setbitu(buff, pos, len,(uint32_t)data);}