字符拼接方法

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; //原始的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 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值