求移动CMPP2 MSGID生成和解码的算法

nemo320 2011-04-02 03:29:17
这个算法是CMPP2.0中产生Msg_Id的算法。
算法如下:
采用64位(8字节)的整数:
(1) 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,
其中
bit64~bit61:月份的二进制表示;
bit60~bit56:日的二进制表示;
bit55~bit51:小时的二进制表示;
bit50~bit45:分的二进制表示;
bit44~bit39:秒的二进制表示;
(2) 短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中。
(3) 序列号:bit16~bit1,顺序增加,步长为1,循环使用。
各部分如不能填满,左补零,右对齐。

请高手解答
...全文
361 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
现写了一个,可以参考一下:

public class Test {

public static void main(String[] args) {
CmppMessageId messageId = CmppMessageId.next(12345);
System.out.println("long: " + messageId.getMessageId());
System.out.println(" hex: " + messageId.getHexMessageId());
System.out.println(messageId);
System.out.println("-------------------");
long id = messageId.getMessageId();
CmppMessageId pa = CmppMessageId.parse(id);
System.out.println(pa);
System.out.println(pa.equals(messageId));
System.out.println("-------------------");
String hex = messageId.getHexMessageId();
CmppMessageId pb = CmppMessageId.parse(hex);
System.out.println(pb);
System.out.println(pb.equals(messageId));
}
}


import java.util.Calendar;
import java.util.concurrent.atomic.AtomicInteger;

public class CmppMessageId {

private final static char[] HEX = "0123456789abcdef".toCharArray();

private static AtomicInteger atomic = new AtomicInteger(0);

private long messageId;

private int month;
private int day;
private int hour;
private int minute;
private int second;
private int gateway;
private int sequence;

private CmppMessageId() {
}

private CmppMessageId(int gateway) {
this.gateway = gateway;
this.sequence = atomic.getAndIncrement() & 0xff;
timeSetting();
messageIdSetting();
}

public static CmppMessageId next(int gateway) {
return new CmppMessageId(gateway);
}

public static CmppMessageId parse(long messageId) {
CmppMessageId cmppMessageId = new CmppMessageId();
cmppMessageId.messageId = messageId;
cmppMessageId.month = (int)((messageId >>> 60) & 0xf);
cmppMessageId.day = (int)((messageId >>> 55) & 0x1f);
cmppMessageId.hour = (int)((messageId >>> 50) & 0x1f);;
cmppMessageId.minute = (int)((messageId >>> 44) & 0x3f);;
cmppMessageId.second = (int)((messageId >>> 38) & 0x3f);;
cmppMessageId.gateway = (int)((messageId >>> 16) & 0x3fffff);;
cmppMessageId.sequence = (int)(messageId & 0xff);;
return cmppMessageId;
}

public static CmppMessageId parse(String hexMessageId) {
return parse(Long.parseLong(hexMessageId, 16));
}

private void timeSetting() {
Calendar current = Calendar.getInstance();
this.month = current.get(Calendar.MONTH) + 1;
this.day = current.get(Calendar.DATE);
this.hour = current.get(Calendar.HOUR_OF_DAY);
this.minute = current.get(Calendar.MINUTE);
this.second = current.get(Calendar.SECOND);
}

private void messageIdSetting() {
messageId |= (long)month << 60L;
messageId |= (long)day << 55L;
messageId |= (long)hour << 50L;
messageId |= (long)minute << 44L;
messageId |= (long)second << 38L;
messageId |= (long)gateway << 16L;
messageId |= (long)sequence & 0xffL;
}

public String getHexMessageId() {
char[] chs = new char[16];
chs[ 0] = HEX[(int)((messageId >>> 60) & 0xf)];
chs[ 1] = HEX[(int)((messageId >>> 56) & 0xf)];
chs[ 2] = HEX[(int)((messageId >>> 52) & 0xf)];
chs[ 3] = HEX[(int)((messageId >>> 48) & 0xf)];
chs[ 4] = HEX[(int)((messageId >>> 44) & 0xf)];
chs[ 5] = HEX[(int)((messageId >>> 40) & 0xf)];
chs[ 6] = HEX[(int)((messageId >>> 36) & 0xf)];
chs[ 7] = HEX[(int)((messageId >>> 32) & 0xf)];
chs[ 8] = HEX[(int)((messageId >>> 28) & 0xf)];
chs[ 9] = HEX[(int)((messageId >>> 24) & 0xf)];
chs[10] = HEX[(int)((messageId >>> 20) & 0xf)];
chs[11] = HEX[(int)((messageId >>> 16) & 0xf)];
chs[12] = HEX[(int)((messageId >>> 12) & 0xf)];
chs[13] = HEX[(int)((messageId >>> 8) & 0xf)];
chs[14] = HEX[(int)((messageId >>> 4) & 0xf)];
chs[15] = HEX[(int)(messageId & 0xf)];
return new String(chs);
}

public long getMessageId() {
return messageId;
}

public int getMonth() {
return month;
}

public int getDay() {
return day;
}

public int getHour() {
return hour;
}

public int getMinute() {
return minute;
}

public int getSecond() {
return second;
}

public int getGateway() {
return gateway;
}

public int getSequence() {
return sequence;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + day;
result = prime * result + gateway;
result = prime * result + hour;
result = prime * result + (int) (messageId ^ (messageId >>> 32));
result = prime * result + minute;
result = prime * result + month;
result = prime * result + second;
result = prime * result + sequence;
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
CmppMessageId other = (CmppMessageId) obj;
if (day != other.day)
return false;
if (gateway != other.gateway)
return false;
if (hour != other.hour)
return false;
if (messageId != other.messageId)
return false;
if (minute != other.minute)
return false;
if (month != other.month)
return false;
if (second != other.second)
return false;
if (sequence != other.sequence)
return false;
return true;
}

public String toString() {
return "MessageId: " + getHexMessageId() +
", month: " + month +
", day: " + day +
", hour: " + hour +
", minute: " + minute +
", second: " + second +
", gateway: " + gateway +
", sequence: " + sequence;
}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧