A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

import java.io.IOException;
import java.io.UnsupportedEncodingException;

//                设计一个方法, 接收一个由字符串所转成的字节数组,判断数组中指定位置上的字节是否是中文的前一半
//                短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。
public class Exercise {
        public static void main(String[] args) throws IOException {
                                       
                //发短信的功能。
                String s = "设计一个方法, 接收一个由字符串所转成的字节数组,";
                String s1 = "设计一个方法, 接收一个由字符串所转成的字节数组,判断数组中指定位置上的字节是否是中文的前一半短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。";
                String s2 = "设计一个方法,, 接收一个由字符串所转成的字节数组,判断数组中指定位置上的字节是否是中文的前一半短信一次发送字节140个,如果超过140字节就会分为两条。这时如果第140个字节是中文的前半,那么第一条短信应该发送139字节。";
                sentMessage(s);
                sentMessage(s1);
                sentMessage(s2);
        }
       
       
        public static void sentMessage(String s) throws UnsupportedEncodingException{
               
                byte [] bArr = s.getBytes("gbk");
                //如果不够140个字节,直接按一条短信发出
                if (bArr.length < 140){                       
                        System.out.println("Message0:"+s);       
                }
                else{                                //如果超过140个字节进入以下判断
                        //如果第139个字节是汉字的前半部分
                        if(judge(bArr,139)) {
                                //第一条输出前139个字节
                                System.out.println("Message1:"+new String(bArr, 0, 139));
                                System.out.println("Message2:"+new String(bArr, 139, bArr.length - 139));
                        }
                        else {                        //如果第139个字节不是汉字的前半部分
                                //第一条输出前140个字节
                                System.out.println("Message3:"+new String(bArr, 0, 140)) ;
                                System.out.println("Message4:"+new String(bArr, 140, bArr.length - 140)) ;
                        }
                }
        }

        //判断一个位置上的字节是不是一个汉字的前半部分
        public static boolean judge( byte [] bArr ,int x){
                //思路一,通过与指定位置后一位置组合,判断是否为汉字,
                //后证实有漏洞,当指定位置前后都是汉字的时候会出现指定位置为汉字的后半部分,与下一个位置本为汉字前半部分的字节组合也能组成汉字的漏洞
                        //方法一使用位移实现
                        //char ch = (char)(bArr[x] << 8 + bArr[x + 1]);               
                        //方法二使用字符串实现
                        //String s = new String(bArr, x, 2);
               
                //思路二,将字节数组重新转回字符串,然后再转为char数组,
                //实现一个方法用来统计char数组的的个元素实际是占一个字节还是两个字节,
                //如果占两个字节则说明是一个汉字,
                //将每一位上的字节数累加sum,通过比较sum与x的值情况来判断是否为汉字的前一半。
                String s = new String(bArr);
                char []cArr = s.toCharArray();
                int sum = 0;
                boolean result = false;
                for (int i = 0; i < cArr.length; i++){
                        sum = sum + getByte(cArr [i]);
                        if (sum == x - 1 ){
                                sum = sum + getByte(cArr [i + 1]);
                                if (sum == x ){
                                        result = true;
                                }
                                else {
                                        result = false;
                                }
                        }
                        else if (sum ==x-2){
                                sum = sum + getByte(cArr [i + 1]);
                                if(sum != x){
                                        result = false;
                                }
                                else {
                                        result = true;
                                }
                        }       
                               
                        }
               
                return result;
        }
       
        private static int getByte(char c) {
                int x =(int)c & 0xff00;
                int y = x << 8;
                if (y == 0){
                        return 1;
                }
                else {
                        return 2;
                }
        }
}


通过思路二实现了功能,自己想的,不知道有没有什么漏洞,各位高手看看。后来在网上看到了用递归思想做的,不知道跟我这个比,哪个效率高。求教。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

1 个回复

倒序浏览
                         else if (sum ==x-2){
                                sum = sum + getByte(cArr [i + 1]);
                                if(sum != x){
                                        result = false;//开始不明白为什么楼主要把result置成false,但后来发现其实无所谓,这里写continue应该也是一样的吧?
                                }
                                else {
                                        result = true;
                                }
                        }   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马