冲冲冲S 2021-12-03 10:57 采纳率: 75%
浏览 19
已结题

leetcode 已知编码后的结果,如何通过解码得到编码前的内容

问题描述: 传入一个 srvContent ,通过 smsPDUEncoded 方法进行编码, 得到一个list conlist. 那么如果知道 conlist 如何进行解码 得到 srvContent ,尝试了很多方法都达不到预期的效果
例如: 传入: srvContent = "为中华之崛起而读书,Study for the rise of China"
得到: conlist.get(0) = "true-4a4e3a4e2d534e4e4b5d1b8d77800c8bfb4e66002c0053007400750064007900200066006f00720020007400680065002000720069007300650020006f00660020004300680069006e0061"

public List<String> smsPDUEncoded(String srvContent) {
        int length = srvContent.length();
        int k = 0;// 短信截取位
        boolean bo = false;//用于判读短信中是否含有中文
        List<String> conlist = new ArrayList<String>();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            String s1 = srvContent.substring(i, i + 1);
            // 是字符,前面两位是00 中文需要四位16进制来表示
            if (s1.getBytes().length == 1) {
                sb.append("00");
            } else {
                bo = true;
            }
            sb.append(Integer.toHexString(srvContent.charAt(i)));
            if (sb.length() == 280 && bo) {//中文短信字符长度到280分条发送
                String s = sb.toString();
                sb = new StringBuffer();
                sb.append("true-");
                // 最后接上内容编码长度的1/216进制的2位来表示
                if (Integer.toHexString(
                        srvContent.substring(k, i + 1).length() * 2).length() < 2) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(srvContent.substring(k, i + 1)
                        .length() * 2));
                sb.append(s);

                conlist.add(sb.toString());//增加到短信LIST中
                sb = new StringBuffer();
                bo = false;//
                k = i + 1;
            } else if ((i - k) == 159) {//英文短信
                String s = sb.toString();
                sb = new StringBuffer();
                //conlist.add("false-"/* + srvContent.substring(k, i + 1)*/);
                sb.append("false-");
                if (Integer.toHexString(
                        srvContent.substring(k, i + 1).length() * 2).length() < 2) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(srvContent.substring(k, i + 1)
                        .length() * 2));
                sb.append(s);

                conlist.add(sb.toString());//增加到短信LIST中
                
                
                sb = new StringBuffer();
                bo = false;
                k = i + 1;
            } else if (i == length - 1 && !bo) {//英文短信最后一条
                //conlist.add("false-" /*+ srvContent.substring(k, i + 1)*/);
                String s = sb.toString();
                sb = new StringBuffer();
                sb.append("false-");
                // 最后接上内容编码长度的1/216进制的2位来表示
                if (Integer.toHexString(
                        srvContent.substring(k, i + 1).length() * 2).length() < 2) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(srvContent.substring(k, i + 1)
                        .length() * 2));
                sb.append(s);
                conlist.add(sb.toString());
            } else if (i == length - 1 && bo) {//中文短信最后一条
                String s = sb.toString();
                sb = new StringBuffer();
                sb.append("true-");
                // 最后接上内容编码长度的1/216进制的2位来表示
                if (Integer.toHexString(
                        srvContent.substring(k, i + 1).length() * 2).length() < 2) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(srvContent.substring(k, i + 1)
                        .length() * 2));
                sb.append(s);
                conlist.add(sb.toString());
            }
        }
        return conlist;
    }

  • 写回答

1条回答 默认 最新

  • 冲冲冲S 2021-12-03 14:06
    关注
    
    package work;
    
    import java.io.UnsupportedEncodingException;
    
    public class MSMDecode {
        public static void main(String[] args) {
            //0011000D91689158148900F70008008c0032003000320031002d00310032002d00300033002000310031003a00310035003a00340037002d5c714e1c002d4e2d5fc3673a623f002d005500500053005f0045006100730079005f00330053002d8f9351fa7535538b0041503c4e3a003200330031002e0034002c59274e8e62a58b669600503c4e0a9650003100300030002e0030003b8f9351657535
            String str = "0011000D91685162059952F20008008c65c18def7535538b0042503c4e3a003200330038002e0031002c59274e8e62a58b669600503c4e0a9650003100300030002e0030003b65c18def7535538b0041503c4e3a003200330038002e0031002c59274e8e62a58b669600503c4e0a9650003100300030002e0030003b8f9351fa7535538b0043503c4e3a003200330031002e0031002c59274e8e62a5";
            System.out.println("接收电话号码为: "+phoneNumber(str.substring(12,24))+" 短信内容为: "+DecodeUCS2(str.substring(32)));
        }
        //手机号解码
        public static String phoneNumber(String phoneYuan) {
            String phoneNumber= "";
            for(int i = 0; i < 12;i+=2) {
                phoneNumber += phoneYuan.substring(i+1,i+2);
                phoneNumber += phoneYuan.substring(i,i+1);
            }
            return phoneNumber.replace("F", "");
        }
        //发送短信内容解码
        public static String DecodeUCS2(String src) {
            byte[] bytes = new byte[src.length() / 2];
     
            for (int i = 0; i < src.length(); i += 2) {
                try {
                    bytes[i / 2] = (byte) (Integer
                            .parseInt(src.substring(i, i + 2), 16));
                } catch (Exception e) {
                    System.out.println("异常字符:"+src.substring(i, i + 2));
                }
            }
            String reValue="";
            try {
                reValue = new String(bytes, "UTF-16BE");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return reValue;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 修改了问题 12月3日
  • 创建了问题 12月3日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看