字符拼接方法

来源:互联网 发布:极速mac修改器 编辑:程序博客网 时间:2024/09/21 06:33
001最近一直在做位处理方面的事,写了个跳位拼接的一个函数(如前一字节的前3位与后一字节的后5位拼成新的字节)。 
有两个方案:1.取出各段所需的buf用string表示,如“101”,然后按照所需将string链接,再转成二进制,此方案由于相互转换效率不高,没有采用 
2.我采取了通过移位和“|”来处理 
#include <stdio.h>
002#include <stdlib.h>
003#include <string.h>
004 
005typedef 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;
016int 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;
031int 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的一段空间;
047unsigned 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 
099int 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}
原创粉丝点击