001
最近一直在做位处理方面的事,写了个跳位拼接的一个函数(如前一字节的前3位与后一字节的后5位拼成新的字节)。
有两个方案:1.取出各段所需的buf用string表示,如“101”,然后按照所需将string链接,再转成二进制,此方案由于相互转换效率不高,没有采用
2.我采取了通过移位和“|”来处理
#include <stdio.h>
002
#include <stdlib.h>
003
#include <string.h>
004
005
typedef
struct
_together
006
{
007
int
num;
008
unsigned
char
*buf;
009
int
firt[10];
010
int
buf_num[10];
011
int
dest[10];
012
013
}Together;
014
015
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
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
046
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
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
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
109
st.buf_num[0] = 9;
110
st.buf_num[1] = 7;
111
112
st.dest[0] = 0;
113
st.dest[1] = 9;
114
115
116
unsigned
char
*out = put_together(st);
117
for
(
int
i = 0; i < 2; i ++)
118
printf
(
"%02X "
,out[i]);
119
120
121
free
(out);
122
123
return
0;
124
}