How can I quickly encode and then compress a short string containing numbers in c#

后端 未结 2 464
粉色の甜心
粉色の甜心 2020-12-19 10:09

I have strings that look like this:

000101456890
348324000433
888000033380

They are strings that are all the same length and they contain o

2条回答
  •  自闭症患者
    2020-12-19 10:21

    To do it simply, you could consider each as a long (plenty of room there), and hex-encode; that gives you:

    60c1bfa
    5119ba72b1
    cec0ed3264
    

    base-64 would be shorter, but you'd need to look at it as big-endian (note most .NET is little-endian) and ignore leading 0 bytes. That gives you:

    Bgwb+g==
    URm6crE=
    zsDtMmQ=
    

    For example:

        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 bytes = new List(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;
        }
    

提交回复
热议问题