RPC-GWT序列化/java.util.Date编码
我正在创建一个序列化GWT请求的脚本,但在编码日期值以符合RPC-GWT标准时遇到问题。通过查看HTTP日志,我注意到日期值被转换为一些7个字符的字符串,但我无法识别这些模式使用的算法RPC-GWT序列化/java.util.Date编码,java,gwt,encoding,Java,Gwt,Encoding,我正在创建一个序列化GWT请求的脚本,但在编码日期值以符合RPC-GWT标准时遇到问题。通过查看HTTP日志,我注意到日期值被转换为一些7个字符的字符串,但我无法识别这些模式使用的算法 有人知道使用哪种算法来加密这些日期值吗?这些日期值被序列化为自历元(1970年1月1日)起的长值=>毫秒,然后以压缩形式序列化为base64,以变为较短的字符串。请看一看: /** * Parse a string containing a base-64 encoded version of a long
有人知道使用哪种算法来加密这些日期值吗?这些日期值被序列化为自历元(1970年1月1日)起的长值=>毫秒,然后以压缩形式序列化为base64,以变为较短的字符串。请看一看:
/**
* Parse a string containing a base-64 encoded version of a long value.
*
* Keep this synchronized with the version in Base64Utils.
*/
static long longFromBase64(String value) {
int pos = 0;
long longVal = base64Value(value.charAt(pos++));
int len = value.length();
while (pos < len) {
longVal <<= 6;
longVal |= base64Value(value.charAt(pos++));
}
return longVal;
}
/**
* Return an optionally single-quoted string containing a base-64 encoded
* version of the given long value.
*
* Keep this synchronized with the version in Base64Utils.
*/
static String longToBase64(long value) {
// Convert to ints early to avoid need for long ops
int low = (int) (value & 0xffffffff);
int high = (int) (value >> 32);
StringBuilder sb = new StringBuilder();
boolean haveNonZero = base64Append(sb, (high >> 28) & 0xf, false);
haveNonZero = base64Append(sb, (high >> 22) & 0x3f, haveNonZero);
haveNonZero = base64Append(sb, (high >> 16) & 0x3f, haveNonZero);
haveNonZero = base64Append(sb, (high >> 10) & 0x3f, haveNonZero);
haveNonZero = base64Append(sb, (high >> 4) & 0x3f, haveNonZero);
int v = ((high & 0xf) << 2) | ((low >> 30) & 0x3);
haveNonZero = base64Append(sb, v, haveNonZero);
haveNonZero = base64Append(sb, (low >> 24) & 0x3f, haveNonZero);
haveNonZero = base64Append(sb, (low >> 18) & 0x3f, haveNonZero);
haveNonZero = base64Append(sb, (low >> 12) & 0x3f, haveNonZero);
base64Append(sb, (low >> 6) & 0x3f, haveNonZero);
base64Append(sb, low & 0x3f, true);
return sb.toString();
}
private static boolean base64Append(StringBuilder sb, int digit, boolean haveNonZero) {
if (digit > 0) {
haveNonZero = true;
}
if (haveNonZero) {
int c;
if (digit < 26) {
c = 'A' + digit;
} else if (digit < 52) {
c = 'a' + digit - 26;
} else if (digit < 62) {
c = '0' + digit - 52;
} else if (digit == 62) {
c = '$';
} else {
c = '_';
}
sb.append((char) c);
}
return haveNonZero;
}
// Assume digit is one of [A-Za-z0-9$_]
private static int base64Value(char digit) {
if (digit >= 'A' && digit <= 'Z') {
return digit - 'A';
}
// No need to check digit <= 'z'
if (digit >= 'a') {
return digit - 'a' + 26;
}
if (digit >= '0' && digit <= '9') {
return digit - '0' + 52;
}
if (digit == '$') {
return 62;
}
// digit == '_'
return 63;
}
/**
*分析包含长值的base-64编码版本的字符串。
*
*使其与Base64Utils中的版本保持同步。
*/
静态longFromBase64(字符串值){
int pos=0;
long longVal=base64Value(value.charAt(pos++));
int len=value.length();
while(pos>28)&0xf,false);
haveNonZero=base64Append(sb,(高>>22)&0x3f,haveNonZero);
haveNonZero=base64Append(sb,(高>>16)和0x3f,haveNonZero);
haveNonZero=base64Append(sb,(高>>10)和0x3f,haveNonZero);
haveNonZero=base64Append(sb,(高>>4)和0x3f,haveNonZero);
int v=((高&0xf)>30)和0x3);
haveNonZero=base64Append(sb,v,haveNonZero);
haveNonZero=base64Append(sb,(低>>24)和0x3f,haveNonZero);
haveNonZero=base64Append(sb,(低位>>18)&0x3f,haveNonZero);
haveNonZero=base64Append(sb,(低位>>12)和0x3f,haveNonZero);
base64Append(sb,(低>>6)和0x3f,haveNonZero);
base64Append(sb,低&0x3f,真);
使某人返回字符串();
}
私有静态布尔base64Append(StringBuilder sb,整数数字,布尔值非零){
如果(数字>0){
haveNonZero=true;
}
if(非零){
INTC;
如果(数字<26){
c=‘A’+位;
}否则,如果(数字<52){
c=‘a’+数字-26;
}否则如果(数字<62){
c='0'+数字-52;
}否则如果(数字==62){
c=“$”;
}否则{
c='uu';
}
sb.附加((char)c);
}
返回值不为零;
}
//假设数字是[A-Za-z0-9$中的一个
专用静态int base64值(字符数字){
如果(digit>='A'&&digit='0'&&digit了解更多信息,GWT项目发布了库GWT user
(),其中包含类Base64Utils
可以帮助对Base64进行编码/解码,如下所述:
我使用以下代码将日期转换为GWT Base64字符串(7个字符):
它帮助了我,谢谢你!
public String dateToGWTString(Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
Date dateWithoutTime = simpleDateFormat.parse(simpleDateFormat.format(date));
return Base64Utils.toBase64(dateWithoutTime.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}