从gwt-rpc字符串中获取时间戳

时间:2014-12-20 17:52:12

标签: json

我收到服务器的回复,如下所示:

//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"

5 个答案:

答案 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;

}