使用Javascript从utf8转换为十六进制并返回

时间:2017-02-22 23:53:38

标签: javascript webcryptoapi

我尝试使用WebCrypto加密文本。我将结果转换为utf8字符串,然后将其转换为十六进制。加密/解密有效。但是,我想将数据转换为十六进制。当我尝试转换为十六进制并返回时,结果是不同的。

这里是小提琴(使用Chrome):https://jsfiddle.net/yxp01v5g/

测试代码在这里:

private LoginPageModel login

如您所见,我取结果,将其转换为十六进制,然后将其转换回utf8,希望它等于原始结果。但是,事实并非如此。

任何人都可以告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:3)

我没有深入研究小提琴中用于转换的调用链,但似乎尝试将UTF-16 / UCS-2转换为字节大小而不是缓冲区内容的实际十六进制表示本身。

这是将字节缓冲区内容转换为十六进制字符串表示形式,从十六进制字符串转换为二进制数据的一种方法。

它接受缓冲区中的每个字节并生成其值的两位十六进制表示,并将其连接到字符串。

反向从字符串表示中获取两个字符,并将其转换回字节值表示。

// some bytes as Uint8Array
var random = crypto.getRandomValues(new Uint8Array(16)), i, str = "", allOK = true;

// convert to HEX string representation
for(i = 0; i < random.length; i++) str += pad2(random[i].toString(16));
console.log(str);

// convert back to byte buffer
var buffer = new Uint8Array(random.length);
for(i = 0; i < buffer.length; i++) buffer[i] = parseInt(str.substr(i<<1, 2), 16);

// check if same content
for(i = 0; i < buffer.length; i++) if (buffer[i] !== random[i]) allOK = false;
console.log("All OK?", allOK)

function pad2(s) {return s.length < 2 ? "0" + s : s}; // helper: pad to 2 digits