Google App Script函数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;
}
但它将“”放在日志中
答案 0 :(得分:20)
如果我们在调用Logger.log(signature);
之后立即放置computeDigest()
,我们会:
[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获得了什么:
我尝试使用其他一些字符串,并且它们始终与在线生成器的结果相匹配。
答案 1 :(得分:11)
为了防止这对其他任何人有帮助,我已经整理了一个更为简洁的Mogsdad解决方案:
function md5(str) {
return Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, str).reduce(function(str,chr){
chr = (chr < 0 ? chr + 256 : chr).toString(16);
return str + (chr.length==1?'0':'') + chr;
},'');
}
答案 2 :(得分:5)
一衬垫:
Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "teststring")
.map(function(b) {return ("0" + (b < 0 && b + 256 || b).toString(16)).substr(-2)})
.join("")
答案 3 :(得分:2)
有人说简洁吗? ( / fulldecent带着饮水帽到达派对,包括吸管,其他人已经昏倒了)
Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
.map(function(chr){return (chr+256).toString(16).slice(-2)})
.join('')
答案 4 :(得分:0)
这是将Byte []转换为字符串的简单方法。
在Google提供的文档中找到了此内容:https://developers.google.com/apps-script/reference/utilities/utilities#base64Decode(String)
Utilities.newBlob(myByteArray).getDataAsString();
迟到总比不到好。 (由于在Goole中搜索该主题时,该主题仍然排在第一位,因此这可能对某些人有所帮助。)
答案 5 :(得分:-1)
从此post:
function string2Bin(str) {
var result = [];
for (var i = 0; i < str.length; i++) {
result.push(str.charCodeAt(i).toString(2));
}
return result;
}