java 短信猫 PDU模式发送中文短信

本文详细描述了如何对短信内容进行PDU编码,包括发送端和接收端的处理步骤,特别强调了Unicode编码、0008OC的添加以及十六进制转换时的补位。提供了一个完整的代码示例用于短信内容的组装。
摘要由CSDN通过智能技术生成

参考文章:https://blog.csdn.net/qicheng777/article/details/72057114

具体步骤这个文章讲的很清楚了,但是排版上面有点凌乱

针对组装PUD编码,重新做一下内容梳理

PDU编码分为三个部分  分别为 发送端 接收端 短信内容

发送端处理

1、去掉“+”为奇数,加F:               8613429853402F 
2、交换奇偶位:                            683124893504F2
3、前面加91(国际化):          91683124893504F2
4、因为加了 86、F 、91  所以一共有11+5=16个数  用它的长度除以 2   ->     16 / 2 = 8 => "08"  
5、08加在91前面:             089168 3124893504F2

接收端处理

跟上面类似 但是去掉上面的0891  在前面加上固定的内容 01000D91

1、去掉“+”为奇数,加F:               8613429853402F 
2、交换奇偶位:                            683124893504F2
3、在前面加上固定参数01000D91 :          01000D91683124893504F2

这一段跟参考文章中是不一样的

原文 (1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81)为11000D91

但是这个不符合生成的PDU编码 也是对不上的  正确的应该是01000D91

短信内容处理

短信内容处理起来很简单 就是把内容进行Unicode编码

public static String hexStr2Str(String hexStr) {
        StringBuilder unicode = new StringBuilder();
        for (char c: hexStr.toCharArray()){
            char[] chars = Character.toChars(c);
            for (char ch:chars){
                unicode.append(String.format("%04x",(int)ch));
            }
        }
        return unicode.toString();
    }

但是我们在组合pdu编码的时候需要在前面加上0008OC

这里的oc我当时看文章可能忽略了  这个就是把字符串的字符数量去进行16进制转码 但是这里要进行补位  就是说 16进制转出来齐0的可能为1位 你得补齐两位

MessageResp messageResp = new MessageResp();
        String hexString = Integer.toHexString(a);
        if(hexString.length()<2){
            hexString = "0"+hexString;
        }
messageResp.setCode((phone2+"0008"+hexString+s).length()/2);

然后就是组装起来就好了

完整代码如下:

public static MessageResp create (String phoneNum1,String phoneNum2,String message){
        String phone1 = change(phoneNum1.toCharArray());
        String phone2 = change(phoneNum2.toCharArray());
        phone1 = "0891"+phone1;
        phone2 = "01000D91"+phone2;
        String s = hexStr2Str(message);
        int a =  s.length()/ 2;
        MessageResp messageResp = new MessageResp();
        String hexString = Integer.toHexString(a);
        if(hexString.length()<2){
            hexString = "0"+hexString;
        }
        messageResp.setMessage(phone1+phone2+"0008"+hexString+s);
        messageResp.setCode((phone2+"0008"+hexString+s).length()/2);
        return messageResp;
    }

    public static String change(char [] charArray){
        //遍历数组拿偶数
        for(int i =0;i<charArray.length;i++){
            if(i%2!=0){
                char temp = charArray[i];
                charArray[i] = charArray[i-1];
                charArray[i-1] = temp;
            }
        }
        return String.valueOf(charArray);
    }

    public static String hexStr2Str(String hexStr) {
        StringBuilder unicode = new StringBuilder();
        for (char c: hexStr.toCharArray()){
            char[] chars = Character.toChars(c);
            for (char ch:chars){
                unicode.append(String.format("%04x",(int)ch));
            }
        }
        return unicode.toString();
    }
@Data
public class MessageResp implements Serializable {

    private String message;

    private Integer code;
}

拼接完了可以进行比对 比对的网址PDU编码解码工具

如果有错误可以私信我进行改正

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值