001 |
最近一直在做位处理方面的事,写了个跳位拼接的一个函数(如前一字节的前3位与后一字节的后5位拼成新的字节)。 |
002 |
#include
<stdlib.h> |
003 |
#include
<string.h> |
004 |
005 |
typedef struct _together |
006 |
{ |
007 |
int num; //待拼凑数据段的数目; |
008 |
unsigned char *buf; //原始的buf; |
009 |
int firt[10]; //起始位置; |
010 |
int buf_num[10]; //长度; |
011 |
int dest[10]; //目的位置; |
012 |
|
013 |
}Together; |
014 |
015 |
//对str数组整体左移move_num位,move_num不大于8; |
016 |
int lift_move(unsigned char *str, int str_length, int move_num) |
017 |
{ |
018 |
unsigned char b,k; |
019 |
k
= 0x00; |
020 |
for ( int i
= str_length - 1; i >= 0; i --) |
021 |
{ |
022 |
b
= str[i] & (0xff << (8 - move_num%8)); |
023 |
str[i]
<<= (move_num%8); |
024 |
str[i]
|= k; |
025 |
k
= b >> (8 - move_num%8); |
026 |
} |
027 |
return 0; |
028 |
} |
029 |
030 |
//对str数组整体右移move_num位,move_num不大于8; |
031 |
int right_move(unsigned char *str, int str_length, int move_num) |
032 |
{ |
033 |
unsigned char b,k; |
034 |
k
= 0x00; |
035 |
for ( int i
= 0; i < str_length; i ++) |
036 |
{ |
037 |
b
= str[i] & (0xff >> (8 - move_num%8)); |
038 |
str[i]
>>= (move_num%8); |
039 |
str[i]
|= k; |
040 |
k
= b << (8 - move_num%8); |
041 |
} |
042 |
return 0; |
043 |
} |
044 |
045 |
//对于给定的数据区buf,取出多段指定的某几位(如第5位开始得10位),指定位置,拼接成新的buf; |
046 |
//对于原始buf,给定指定的起始位置和取得bit数,目标的起始位置,拼成新的byte,用于跳字节拼接,返回值是malloc的一段空间; |
047 |
unsigned char *put_together(Together
stru) |
048 |
{ |
049 |
int res_byte
= 0; |
050 |
for ( int i
= 0; i < stru.num; i ++) |
051 |
{ |
052 |
res_byte
+= stru.buf_num[i]; |
053 |
} |
054 |
res_byte
= res_byte/8 + (res_byte%8 > 0); |
055 |
unsigned char *
outbuf = (unsigned char *) malloc ( sizeof (unsigned char )
* res_byte); |
056 |
memset (outbuf,0,res_byte* sizeof (unsigned char )); |
057 |
for ( int i
= 0; i < stru.num; i ++) |
058 |
{ |
059 |
int num1
= stru.buf_num[i] - (8 - stru.firt[i]%8)%8; |
060 |
int num2
= stru.buf_num[i] - (8 - stru.dest[i]%8)%8; |
061 |
int byte_num1
= num1/8 + (num1%8 > 0) + ((8 - stru.firt[i]%8)%8 > 0); |
062 |
int byte_num2
= num2/8 + (num2%8 > 0) + ((8 - stru.dest[i]%8)%8 > 0); |
063 |
int byte_num; |
064 |
byte_num
= (byte_num1>byte_num2)?byte_num1:byte_num2; |
065 |
066 |
unsigned char *
use_buf = (unsigned char *) malloc ( sizeof (unsigned char )
* byte_num); |
067 |
memset (use_buf,0,byte_num* sizeof (unsigned char )); |
068 |
for ( int j
= 0; j < byte_num1; j ++) |
069 |
use_buf[j]
= stru.buf[stru.firt[i]/8 + j]; |
070 |
071 |
//通过移位将所需的bit位对应到相应位置; |
072 |
lift_move(use_buf,byte_num,stru.firt[i]%8); |
073 |
right_move(use_buf,byte_num,stru.dest[i]%8); |
074 |
int move_num; |
075 |
076 |
//将用不到的bit位置0; |
077 |
if (stru.dest[i]%8
+ stru.buf_num[i] <= 8) |
078 |
{ |
079 |
move_num
= stru.dest[i]%8; |
080 |
use_buf[0]
&= ((0xff<<(8 - stru.buf_num[i]))>>move_num); |
081 |
} |
082 |
else |
083 |
{ |
084 |
move_num
= stru.dest[i]%8; |
085 |
use_buf[0]
&= (0xff>>move_num); |
086 |
move_num
= (stru.buf_num[i] - (8 - move_num))%8; |
087 |
use_buf[(stru.buf_num[i]
- (8 - move_num))/8+1] &= (0xff<<(8-move_num)); |
088 |
} |
089 |
090 |
for ( int j
= 0; j < byte_num; j ++) |
091 |
{ |
092 |
outbuf[stru.dest[i]/8
+ j] |= use_buf[j]; |
093 |
} |
094 |
free (use_buf); |
095 |
} |
096 |
return outbuf; |
097 |
} |
098 |
099 |
int main() |
100 |
{ |
101 |
//测试数据; |
102 |
unsigned char a[]
= {0x11,0x23,0x34,0xab,0x91,0x44,0x00,0xde}; |
103 |
Together
st; |
104 |
st.buf
= a; |
105 |
st.num
= 2; |
106 |
st.firt[0]
= 8; |
107 |
st.firt[1]
= 22; |
108 |
//
st.firt[2] = 32; |
109 |
st.buf_num[0]
= 9; |
110 |
st.buf_num[1]
= 7; |
111 |
//
st.buf_num[2] = 8; |
112 |
st.dest[0]
= 0; |
113 |
st.dest[1]
= 9; |
114 |
//
st.dest[2] = 0; |
115 |
116 |
unsigned char *out
= put_together(st); |
117 |
for ( int i
= 0; i < 2; i ++) |
118 |
printf ( "%02X
" ,out[i]); |
119 |
120 |
//
printf("\n%02X\n",0x20 | 0x02); |
121 |
free (out); |
122 |
123 |
return 0; |
124 |
} |