几句 javascript 转 C# 谢谢各位了

2016-10-14 13:51:01 +08:00
 pyengwoei
这是 gist 连接看起来要好看些 https://gist.github.com/pyengwoei/f34848cc5bf1911e19e6b7773a740c41

如果不能打开就只有看没有格式化的了
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();
1991 次点击
所在节点    程序员
13 条回复
lrh3321
2016-10-14 14:08:56 +08:00
直接在 C#里执行它算了。

https://github.com/sebastienros/jint

对 js 不熟 ,不确定 +new Date 返回的到底是什么
pyengwoei
2016-10-14 14:15:25 +08:00
@lrh3321 +new Date 返回的是时间戳类似这样 1476425715
sutra
2016-10-14 14:22:05 +08:00
不带这样伸手的吧。
pyengwoei
2016-10-14 14:24:15 +08:00
@sutra 我自己也在转,边百度边转,但是可能对于 C#熟悉的人 几分钟就好了,望见谅
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
2016-10-14 14:29:08 +08:00
var aaa = Convert.ToBase64String(DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond);
imcxy
2016-10-14 14:31:32 +08:00
@sutra 看起来好吊,我决定去学 C#了~
sutra
2016-10-14 14:34:02 +08:00
@imcxy 我可能看错了, JS 原文好像不是 base64.
lrh3321
2016-10-14 14:46:04 +08:00
num = (int)(num / length) ;
改成
num = (long)(num / length) ;

用长整型应该更保险一点
pyengwoei
2016-10-14 15:01:57 +08:00
@lrh3321 好的我再试试,我刚刚试了 正确得出的是一个五位数的字符 LV1JPJk 但是用 C#得出的是 1V1_ZP2 开头还对不太起来好像就是 encoded = alphabet[num % length] + encoded; 这里有点问题,不过其他地方应该都没什么问题了,这里我再试试
pyengwoei
2016-10-14 15:04:11 +08:00
@lrh3321 现在好像可以了 这次得到的结果是 LV20I3B
pyengwoei
2016-10-14 15:06:21 +08:00
@lrh3321 感谢了
SoloCompany
2016-10-14 23:30:34 +08:00
base64 和 64 进制有区别吗?不就是 base64 换了两个特殊字符吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/312774

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX