V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pyengwoei
V2EX  ›  程序员

几句 javascript 转 C# 谢谢各位了

  •  
  •   pyengwoei · 2016-10-14 13:51:01 +08:00 · 1907 次点击
    这是一个创建于 2764 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是 gist 连接看起来要好看些

    如果不能打开就只有看没有格式化的了
    var alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),
    length = 64,
    map = {},
    seed = 0,
    i = 0,
    prev;

    function encode(num) {
    var encoded = "";
    do {
    encoded = alphabet[num % length] + encoded;
    num = Math.floor(num / length)
    } while (num > 0);
    return encoded
    }

    function yeast() {
    var now = encode(+new Date);
    if (now !== prev) return seed = 0, prev = now;
    return now + "." + encode(seed++)
    }
    aaa =yeast();
    13 条回复    2016-10-14 23:30:34 +08:00
    lrh3321
        1
    lrh3321  
       2016-10-14 14:08:56 +08:00
    直接在 C#里执行它算了。

    https://github.com/sebastienros/jint

    对 js 不熟 ,不确定 +new Date 返回的到底是什么
    pyengwoei
        2
    pyengwoei  
    OP
       2016-10-14 14:15:25 +08:00
    @lrh3321 +new Date 返回的是时间戳类似这样 1476425715
    sutra
        3
    sutra  
       2016-10-14 14:22:05 +08:00
    不带这样伸手的吧。
    pyengwoei
        4
    pyengwoei  
    OP
       2016-10-14 14:24:15 +08:00
    @sutra 我自己也在转,边百度边转,但是可能对于 C#熟悉的人 几分钟就好了,望见谅
    lrh3321
        5
    lrh3321  
       2016-10-14 14:28:08 +08:00
    我尽力了

    var aaa =ClassA.yeast();

    ```csharp
    static class ClassA
    {
    static char[] alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".ToCharArray();
    static int length = 64, seed = 0, i = 0;

    static string prev = null;

    public static string encode(long num) {
    var encoded = "";
    do {
    encoded = alphabet[num % length] + encoded;
    num = (int)(num / length) ;
    } while (num > 0);
    return encoded;
    }

    /// <summary>
    /// 获取时间戳
    /// </summary>
    /// <returns></returns>
    public static long GetTimeStamp()
    {
    TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
    return (long)ts.TotalMilliseconds;
    }

    public static string yeast() {
    var now = encode(GetTimeStamp());
    if (now != prev){
    seed = 0;
    return prev = now;

    }
    return now + "." + encode(seed++);
    }
    }

    ```
    sutra
        6
    sutra  
       2016-10-14 14:29:08 +08:00
    var aaa = Convert.ToBase64String(DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond);
    imcxy
        7
    imcxy  
       2016-10-14 14:31:32 +08:00
    @sutra 看起来好吊,我决定去学 C#了~
    sutra
        8
    sutra  
       2016-10-14 14:34:02 +08:00
    @imcxy 我可能看错了, JS 原文好像不是 base64.
    lrh3321
        9
    lrh3321  
       2016-10-14 14:46:04 +08:00   ❤️ 1
    num = (int)(num / length) ;
    改成
    num = (long)(num / length) ;

    用长整型应该更保险一点
    pyengwoei
        10
    pyengwoei  
    OP
       2016-10-14 15:01:57 +08:00
    @lrh3321 好的我再试试,我刚刚试了 正确得出的是一个五位数的字符 LV1JPJk 但是用 C#得出的是 1V1_ZP2 开头还对不太起来好像就是 encoded = alphabet[num % length] + encoded; 这里有点问题,不过其他地方应该都没什么问题了,这里我再试试
    pyengwoei
        11
    pyengwoei  
    OP
       2016-10-14 15:04:11 +08:00
    @lrh3321 现在好像可以了 这次得到的结果是 LV20I3B
    pyengwoei
        12
    pyengwoei  
    OP
       2016-10-14 15:06:21 +08:00
    @lrh3321 感谢了
    SoloCompany
        13
    SoloCompany  
       2016-10-14 23:30:34 +08:00
    base64 和 64 进制有区别吗?不就是 base64 换了两个特殊字符吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6073 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 01:49 · PVG 09:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.