Google App 脚本函数 computeDigest 返回签名的字节数组。如何获取摘要的字符串表示形式?
我已经尝试过 bin2String() 函数。
function sign(){
var signature = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
Logger.log(bin2String(signature));
}
function bin2String(array) {
var result = "";
for (var i = 0; i < array.length; i++) {
result += String.fromCharCode(parseInt(array[i], 2));
}
return result;
}
但它在日志中放入了“”
最佳答案
如果我们在 computeDigest()
调用之后放置 Logger.log(signature);
,我们会得到:
[8, 30, -43, 124, -101, 114, -37, 10, 78, -13, -102, 51, 65, -24, -83, 81]
在javascript中,摘要包括正整数和负整数,所以我们不能简单地把它们当作ascii字符。然而,MD5 算法应该为我们提供 8 位值,范围为 0x00 到 0xFF (255)。那么,那些负值只是对高位的误解;把它当作一个标志位。要更正,我们需要将 256 添加到任何负值。
How to convert decimal to hex in JavaScript?给我们这个来检索十六进制字符:
hexString = yourNumber.toString(16);
将它们放在一起,这是您的 sign()
函数,它也是 available as a gist :
function sign(message){
message = message || "thisisteststring";
var signature = Utilities.computeDigest(
Utilities.DigestAlgorithm.MD5,
message,
Utilities.Charset.US_ASCII);
Logger.log(signature);
var signatureStr = '';
for (i = 0; i < signature.length; i++) {
var byte = signature[i];
if (byte < 0)
byte += 256;
var byteStr = byte.toString(16);
// Ensure we have 2 chars in our byte, pad with 0
if (byteStr.length == 1) byteStr = '0'+byteStr;
signatureStr += byteStr;
}
Logger.log(signatureStr);
return signatureStr;
}
这是日志包含的内容:
[13-04-25 21:46:55:787 EDT] [8, 30, -43, 124, -101, 114, -37, 10, 78, -13, -102, 51, 65, -24, -83, 81]
[13-04-25 21:46:55:788 EDT] 081ed57c9b72db0a4ef39a3341e8ad51
让我们看看我们从 this on-line MD5 Hash Generator 得到了什么:
我用其他几个字符串尝试过,它们始终与在线生成器的结果匹配。
关于javascript - 从 computeDigest(algorithm, value) byte[] 取回字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216868/