从computeDigest(算法,值)字节返回字符串表示[](get back a string

2019-09-01 03:12发布

谷歌应用程序脚本函数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;
}

但是却让“”在日志

Answer 1:

如果我们把Logger.log(signature); 在调用之后computeDigest()我们得到:

[8, 30, -43, 124, -101, 114, -37, 10, 78, -13, -102, 51, 65, -24, -83, 81]

由于在JavaScript表示,该摘要既包括正面和负面的整数,所以我们不能简单地把他们当作ASCII字符。 MD5算法,然而,应为0xFF(255)为我们提供的8位值,在范围为0x00。 这些负值,那么,仅仅是高阶位的曲解; 同时它是一个符号位。 要纠正,我们需要增加256至任何负值。

如何将十进制转换为十六进制在JavaScript? 给了我们这个检索十六进制字符:

hexString = yourNumber.toString(16);

把一起,这里是你的sign()函数,这也可以作为一个要点 :

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

让我们来看看我们从获取到该在线MD5散列发生器 :

我与几个其他字符串试了一下,他们一直从上线发生器相匹配的结果。



Answer 2:

以防万一,这是有帮助的任何人,我已经把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;
  },'');
}


Answer 3:

一内胆:

Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "teststring")
  .map(function(b) {return ("0" + (b < 0 && b + 256 || b).toString(16)).substr(-2)})
  .join("")


Answer 4:

有人说了简洁的? (/ fulldecent到达与饮用的帽子,包括吸管聚会,其他人都已经通过了之后

Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, "thisisteststring")
  .map(function(chr){return (chr+256).toString(16).slice(-2)})
  .join('')


Answer 5:

从这个帖子 :

function string2Bin(str) {
  var result = [];
  for (var i = 0; i < str.length; i++) {
    result.push(str.charCodeAt(i).toString(2));
  }
  return result;
}


文章来源: get back a string representation from computeDigest(algorithm, value) byte[]