【关键字】
字符串加密 / MD5 / Unicode编码
【问题描述】
如下代码中的data1,不包含中文时是正常的,包含中文时就和其它iOS、安卓后台MD5后的摘要结果不一致了,如何解决?
str = '中文就乱了,英文是正常的'
let md:cryptoFramework.Md =cryptoFramework.createMd("MD5");
let promiseMdUpdate:Promise<void> = md.update(GenDataBlob(16, str));
return promiseMdUpdate.then(() => {
let PromiseMdDigest = md.digest();
return PromiseMdDigest;
}).then(mdOutput => {
console.info("[Promise]: MD result: " + mdOutput.data);
let data1 = uint8ArrayToString(mdOutput.data)
let that = new util.Base64Helper();
let sigValue:string = that.encodeToStringSync(mdOutput.data);
return sigValue
}).catch((error:String) => {
console.error("[Promise]: error: " + error);
});
【解决方案】
请参考下面的处理方式解决:
// 字符串转成字节流
function stringToUint8Array(str: string) {
return new Uint8Array(buffer.from(str,'utf-8').buffer);
}
// 字节流转成可理解的字符串
function uint8ArrayToString(array: Uint8Array) {
// 将UTF-8编码转换成Unicode编码
let out: string = "";
let index: number = 0;
let len: number = array.length;
while (index < len) {
let character = array[index++];
switch (character >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
out += String.fromCharCode(character);
break;
case 12:
case 13:
out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));
break;
case 14:
out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0));
break;
default:
break;
}
}
return out;
}