若字符串都是由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();