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 | } |