我收到服务器的回复,如下所示:
//OK[0,1,"UpoNlmA",3,5,4,"UpoNlmA",3,2,0,1,"UpoUdDA",3,5,4,"UpoUdDA",3,2,0,1,"UpoZCBA",3,5,4,"UpoZCBA",3,2,0,1,"UpoJAoA",3,5,4,"UpoJNUg",3,2,0,1,"UpoLTHA",3,5,4,"UpoLdHo",3,2,0,1,"UpoSKkA",3,5,4,"UpoSKkA",3,2,0,1,"UpoP4FA",3,5,4,"UpoP4FA",3,2,0,1,"UpoWviA",3,5,4,"UpoWviA",3,2,8,1,["java.util.ArrayList/4159755760","com.initka.onlineinfo.server.datamodel.DepartureInformation/276724449","java.util.Date/3385151746","city","xyz"],0,7]
我的研究让我假设这是一个GWT-RPC响应。现在的问题是,我如何反序列化曾经是时间戳的字符串"UpoP4FA"
?
答案 0 :(得分:1)
这就是Google Web Toolkit在RPC中编码long的方式。时间戳也以这种格式编码。
编码非常简单:这里的字母表是ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ $,而不是字母表0123456789(用于小数,基数为10),而且基数为64.
这是一个python片段,用于解码编码如下的数字:
def from_gwt_long(inp):
base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$"
return sum(base.index(inp[p]) * (len(base) ** (len(inp) - p - 1)) for p in range(len(inp)))
您也可以将上面给出的字母放入此基本转换器:http://elenzil.com/esoterica/baseConversion.html
答案 1 :(得分:0)
function decodeTime($sTime) {
$sBase = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$";
$iSum = 0;
for ($i = 0; $i < strlen($sTime); $i++) {
$iSum += strpos($sBase, $sTime{$i}) * pow(strlen($sBase), strlen($sTime) - $i - 1);
}
return $iSum / 1000;
}
答案 2 :(得分:0)
void DecodeTime()
{
string str =&#34; UpoUdDA&#34 ;;
string Base =&#34; ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 _ $&#34 ;;
Int64 Sum = 0;
for (int i = 0; i < str.Length; i++)
{
for (int j = 0; j < Base.Length; j++)
{
if (Base[j] == str[i])
{
Sum += j * Convert.ToInt64(Math.Pow(Base.Length, str.Length - i - 1));
break;
}
}
}
Console.WriteLine(new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(Math.Round(Convert.ToDouble(Sum/1000))));
}
您可以使用上面的代码来解码字符串,例如&#34; UpoUdDA&#34;。
答案 3 :(得分:0)
对于java.util.Date/1659716317
(与问题中的格式不同;可能是旧的,我在Web应用程序中看到了一些提及2010),人们可能会看到如下内容:
//OK[1,0,0,0,8,1.473173782528E12,5.15763472E8,7,635 ...
此处,JavaScript日期使用:
创建new Date(1.473173782528E12 + 5.15763472E8);
答案 4 :(得分:0)
在Java中,这种解码将是
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;
}
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;
}