要做到這一點只是,你可以考慮每一個long
(充足的房間裏有),和十六進制編碼; ,讓你:
60c1bfa
5119ba72b1
cec0ed3264
基地-64將是短,但你需要把它看成大端(注意:大多數.NET是小端)和忽略前導0字節。這就給了你:
Bgwb+g==
URm6crE=
zsDtMmQ=
例如:
static void Main()
{
long x = 000101456890L, y = 348324000433L, z = 888000033380L;
Console.WriteLine(Convert.ToString(x, 16));
Console.WriteLine(Convert.ToString(y, 16));
Console.WriteLine(Convert.ToString(y, 16));
Console.WriteLine(Pack(x));
Console.WriteLine(Pack(y));
Console.WriteLine(Pack(z));
Console.WriteLine(Convert.ToInt64("60c1bfa", 16).ToString().PadLeft(12, '0'));
Console.WriteLine(Convert.ToInt64("5119ba72b1", 16).ToString().PadLeft(12, '0'));
Console.WriteLine(Convert.ToInt64("cec0ed3264", 16).ToString().PadLeft(12, '0'));
Console.WriteLine(Unpack("Bgwb+g==").ToString().PadLeft(12, '0'));
Console.WriteLine(Unpack("URm6crE=").ToString().PadLeft(12, '0'));
Console.WriteLine(Unpack("zsDtMmQ=").ToString().PadLeft(12, '0'));
}
static string Pack(long value)
{
ulong a = (ulong)value; // make shift easy
List<byte> bytes = new List<byte>(8);
while (a != 0)
{
bytes.Add((byte)a);
a >>= 8;
}
bytes.Reverse();
var chunk = bytes.ToArray();
return Convert.ToBase64String(chunk);
}
static long Unpack(string value)
{
var chunk = Convert.FromBase64String(value);
ulong a = 0;
for (int i = 0; i < chunk.Length; i++)
{
a <<= 8;
a |= chunk[i];
}
return (long)a;
}
是不壓縮包含數字的字符串以將其存儲爲數字而不是字符串的最簡單方法? – AntonyW 2011-06-15 10:29:30
@AntonyW - 我在問題中添加了一些內容。希望這解釋得更好 – czhili 2011-06-15 10:33:23