参考文章: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编码解码工具
如果有错误可以私信我进行改正