2015-11-20 52 views
2

我有问题,我得到的JS对象的字段,如...标题:“действительный有效なដែលមាន...或例如包含这种表情现在,由于加密,我需要这些信息转换为UINT8。表情符号和字符都像是破碎而UInt8转换

处理该转换看起来像这样的代码(在一般情况下正常工作......)

public arrayBufferToString(arrayBuffer : Uint8Array) : string { 
     var str : string = String.fromCharCode.apply(null, new Uint8Array(arrayBuffer)); 
     return str; 
    } 

    public stringToArrayBuffer(string:string) : Uint8Array { 
     if(typeof string === 'undefined' || string === null){ 
      this.$log.warn('Cannot convert an undefined string'); 
      return null; 
     } 

     var arrayBuffer : any = new ArrayBuffer(string.length); 
     var buffer : Uint8Array = new Uint8Array(arrayBuffer); 
     for (var i : number = 0, stringLength : number = string.length; i < stringLength; i++) { 
      buffer[i] = string.charCodeAt(i); 
     } 
     return buffer; 
    } 

在这种情况下,但是,我有这样的输入: “title”:“действительный有效なដែលមានសុពលភា012效有效માન્યમાבתוקף “和输出,格式回一个字符串,这样 后 ”头衔“:” 459AB28B5; L = K9¹j¶»¶HH®¾¨Í¯®¾ÑêÕçã”

你有什么为什么发生这种情况?谢谢!

+1

你的表情是不适合在8位字符代码。 – Pointy

回答

1

以下脚本将加密和解密dataToEncrypt。它使用现代Encoding API

"use strict"; 

var dataToEncrypt = "дей ... hopefully, it means 'day' :)"; 
var iv = window.crypto.getRandomValues(new Uint8Array(16)); 
var algorithm = { 
    name: "AES-CBC", 
    iv: iv 
}; 

window.crypto.subtle.generateKey(
    { 
     name: "AES-CBC", 
     length: 128 
    }, 
    /* extractable */ true, 
    /*keyUsages */ ['encrypt', 'decrypt'] 
). 
then(function (aesKey) { 
     var uint16array = new TextEncoder('utf-16').encode(dataToEncrypt); 

     window.crypto.subtle.encrypt(algorithm, aesKey, uint16array) 
      .then(function (encryptedArrayBuffer) { 

       console.log("encrypted", ab2hexstr(encryptedArrayBuffer)); 

       window.crypto.subtle.decrypt(algorithm, aesKey, encryptedArrayBuffer) 
        .then(function (result) { 
         console.log("decrypted", new TextDecoder('utf-16').decode(result)); 
        }) 
        .catch(function (err) { 
         console.log("Decryption failed.", err); 
        }); 
      }) 
      .catch(function (err) { 
       console.log("Encryption failed.", err); 
      }); 
    } 
). 
catch(function (err) { 
    console.log("generateKey - failed.", err); 
}); 

function ab2hexstr(buf) { 
    var byteArray = new Uint8Array(buf); 
    var hexString = ""; 
    var nextHexByte; 

    for (var i = 0; i < byteArray.byteLength; i++) { 
     nextHexByte = byteArray[i].toString(16); // Integer to base 16 
     if (nextHexByte.length < 2) { 
      nextHexByte = "0" + nextHexByte;  // Otherwise 10 becomes just a instead of 0a 
     } 
     hexString += nextHexByte; 
    } 
    return hexString; 
} 

脚本是基于crypto.js

注:

我没有用的打字稿,但你可以根据需要添加类型。

资源:

+1

非常感谢你!这太棒了 :) – PlasmaLampe