ユーザーが1221931027のようなUNIXタイムスタンプを覚えて挿入する必要があるアプリケーションがあります。キーを覚えやすくするために、文字[az]を許可して挿入する文字数を減らすのが好きです。そのため、タイムスタンプを短い英数字バージョンに変換し、逆方向に同じことを行うアルゴリズムを探しています。ヒントはありますか?
1368 次
4 に答える
5
タイムスタンプをbase-36に変換するだけです。
于 2008-09-20T17:31:37.610 に答える
2
#include <time.h>
#include <stdio.h>
// tobase36() returns a pointer to static storage which is overwritten by
// the next call to this function.
//
// This implementation presumes ASCII or Latin1.
char * tobase36(time_t n)
{
static char text[32];
char *ptr = &text[sizeof(text)];
*--ptr = 0; // NUL terminator
// handle special case of n==0
if (n==0) {
*--ptr = '0';
return ptr;
}
// some systems don't support negative time values, but some do
int isNegative = 0;
if (n < 0)
{
isNegative = 1;
n = -n;
}
// this loop is the heart of the conversion
while (n != 0)
{
int digit = n % 36;
n /= 36;
*--ptr = digit + (digit < 10 ? '0' : 'A'-10);
}
// insert '-' if needed
if (isNegative)
{
*--ptr = '-';
}
return ptr;
}
int main(int argc, const char **argv)
{
int i;
for (i=1; i<argc; ++i)
{
long timestamp = atol(argv[i]);
printf("%12d => %8s\n", timestamp, tobase36(timestamp));
}
}
/*
$ gcc -o base36 base36.c
$ ./base36 0 1 -1 10 11 20 30 35 36 71 72 2147483647 -2147483647
0 => 0
1 => 1
-1 => -1
10 => A
11 => B
20 => K
30 => U
35 => Z
36 => 10
71 => 1Z
72 => 20
2147483647 => ZIK0ZJ
-2147483647 => -ZIK0ZJ
*/
于 2008-09-20T18:51:48.447 に答える
0
このような場合に時々使用される別のオプションは、音節のリストを使用することです。すなわち。['a','ab', 'ba','bi','bo','ca','...] のような音節のリストがあり、その数値を base(len(list_of_syllables)) に変換します。これは文字で言えば長くなりますが、「af3q5jl」のようなものよりも「flobagoka」のようなものの方が覚えやすいことがよくあります (欠点は、冒涜のように聞こえる単語を生成しやすいことです)。
[編集] このようなアルゴリズムの例を次に示します。これを使用すると、1221931027 は「buruvadrage」になります。
于 2008-09-20T18:51:21.210 に答える
0
タイムスタンプを HEX に変換します。これにより、タイムスタンプから短い英数字が生成されます。
于 2008-09-20T17:34:25.623 に答える