若字符串都是由asiic码中的字符组成,我们可以把一个字符转成8位来表示,比如a的ascii码是97,对应的二进制是0110,0001,所以我们可以用一个int(32位)来表示4个字符(char),或者64位的int表示8个char。在C#中一个char是16位Unicode 字符,这样,可以省一半的空间。当然这只是个trick,或者当个练笔也不错。
下面是代码实现:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace StringCompresser 
{ 
    public static class ExtentionString 
    { 
        public static int[] ToInt32(this string url) 
        { 
            if(string.IsNullOrEmpty(url)) 
            { 
                return null; 
            } 

            // 
            //we can use an 8-bit to present a char. So we can use an integer to present 4 char. 
            // 
            int arraylen = url.Length >> 2; 
             
            // 
            //if url length < 4 char. We only use one integer. Or if more char left after dividing by 4 characters. 
            //The length of return int[] must enlarge 1 
            // 
            if(arraylen==0 || url.Length % 4 > 0) 
            { 
                arraylen++; 
            } 
             

            int[] rtnArray = new int[arraylen]; 
             
             
            //1234,5678,90 

            //fill the first part of return array. That is 1234,5678 
            for (int i = 0; i < url.Length >> 2; i++) 
            { 
                int val1 = (int)url[i << 2]; 
                int val2 = (int)url[(i << 2) + 1]; 
                int val3 = (int)url[(i << 2) + 2]; 
                int val4 = (int)url[(i << 2) + 3]; 

                rtnArray[i] = (val1 << 24) | (val2 << 16) | (val3 << 8) | val4; 
            } 


            //fill the second part of return array. That is 90 
            for (int i = url.Length % 4; i >0; i--) 
            { 
                rtnArray[arraylen - 1] |= (url[url.Length - i] << ((i-1) << 2)); 
            } 

            return rtnArray; 
        } 

        public static long[] ToInt64(this string url) 
        { 
            if (string.IsNullOrEmpty(url)) 
            { 
                return null; 
            } 

            // 
            //we can use an 8-bit to present a char. So we can use an long to present 8 char. 
            // 
            int arraylen = url.Length >> 3; 

            // 
            //if url length < 8 char. We only use one integer. Or if more char left after dividing by 8 characters. 
            //The length of return int[] must enlarge 1 
            // 
            if (arraylen == 0 || url.Length % 8 > 0) 
            { 
                arraylen++; 
            } 


            long[] rtnArray = new long[arraylen]; 


            //1234,5678,9012,3456,1234,5678 

            //fill the first part of return array. That is 1234,5678,9012,3456 
            for (int i = 0; i < url.Length >> 3; i++) 
            { 
                long val1 = (long)url[i << 3]; 
                long val2 = (long)url[(i << 3) + 1]; 
                long val3 = (long)url[(i << 3) + 2]; 
                long val4 = (long)url[(i << 3) + 3]; 
                long val5 = (long)url[(i << 3) + 4]; 
                long val6 = (long)url[(i << 3) + 5]; 
                long val7 = (long)url[(i << 3) + 6]; 
                long val8 = (long)url[(i << 3) + 7]; 

                rtnArray[i] = (val1 << 56) | (val2 << 48) | (val3 << 40) | (val4 << 32) 
                    | (val5 << 24) | (val6 << 16) | (val7<<8) | val8; 
            } 

            //fill the second part of return array. That is 1234,5678 
            for (int i = url.Length % 8; i > 0; i--) 
            { 
                rtnArray[arraylen - 1] |= (url[url.Length - i] << ((i - 1) << 3)); 
            } 

            return rtnArray; 
        } 
    } 
}

可以这样调用string str = "abcd"; int[] array = str.ToInt32();