现行大部分系统采用Unicode编码Unicode编码是ASCII码的扩展
Ascii码使用一个字节存储字符最多能编码256个字符,而Unicode编码采用两个字节存储字符,最多能编码65536个字符,每个字符都有自己独立的编码。
VB和java内部都是是哟个Unicode编码的。由于数字和英文大小写字符都是Ascii字符集,用两个字节存储一个字节的字符有些浪费,于是为了网络传输方便,就出现了utf-8编码、utf-16编码。
utf-8编码使用动态长度编码字符,对于ascii码内字段小于128的用一个字段编码,其编码方式如下所示:
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.
例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:
11000010 10101001 = 0xC2 0xA9
而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:
11100010 10001001 10100000 = 0xE2 0x89 0xA0
这样就大大的提高到磁盘利用率,提高网络传输效率。
那么如何获取字符的Ascii码呢?
vba用asc("字符")函数获取字符的ascii码,注意:非ascii码表的字符会出现负值情况,建议使用其扩展码表函数:ascw("字符")
对于大于ascii扩展码表的字符这样依然会出现负值情况,这时我们用以下函数直接获取Unicode码:CLng("&h"+Hex$(AscW((Mid([Str],1,1)))))
这样就取得了字符的Unicode码,然后你就可以将其转成utf-8格式,再转成二进制字节流使用md5或者自定义函数进行加密解密了。
自定义函数如:
字符二进制字节为:01010001 01010011
你可以进行反转 :11001010 10001010
替换 :00110101 01110101
穿插 :01001101 11010101
还可以有更多加密操作,比如<<>> mod等等,最后转成字符存储
就完成了加密,解密过程相反,这里不再赘述。