如何使用Node.js将字节数组转换为字符串?

时间:2013-11-29 09:12:39

标签: javascript node.js

我需要一个随机的字节序列来制作密码哈希。在Ruby中,这看起来像:

 File.open("/dev/urandom").read(20).each_byte{|x| rand << sprintf("%02x",x)}

在Node.js中,我可以得到一个随机字节序列:

 var randomSource = RandBytes.urandom.getInstance();
 var bytes = randomSource.getRandomBytesAsync(20);

但问题是,如何将这些转换为String?

另外,我需要将它们包含在promisses中。这会有用吗?

   get_rand()
   .then(function(bytes) {
     authToken = bytes;
   })

5 个答案:

答案 0 :(得分:19)

试试这个:

new Buffer(bytes).toString('ascii');

此处有更多详情:http://nodejs.org/api/buffer.html

答案 1 :(得分:4)

您可以使用节点附带的加密:

var Promise = require("bluebird");
var crypto = Promise.promisifyAll(require("crypto"));

crypto.randomBytesAsync(20).then(function(bytes){
    console.log('random byte string:', bytes.toString("hex"));
});

日志:

random byte string: 39efc98a75c87fd8d5172bbb1f291de1c6064849

答案 2 :(得分:2)

randbytes异步工作。如果你想将它与promises结合起来,你还需要使用Promises-lib。我使用when作为示例:

var when          = require('when');
var RandBytes     = require('randbytes');
var randomSource  = RandBytes.urandom.getInstance();

function get_rand() {
  var dfd = when.defer();
  randomSource.getRandomBytes(20, function(bytes) {
    dfd.resolve( bytes.toString('hex') ); // convert to hex string
  });
  return dfd.promise;
}

// example call:
get_rand().then(function(bytes) {
  console.log('random byte string:', bytes);
});

答案 3 :(得分:0)

您想将int转换为ASCII吗?如果没有,这是我的代码(1分钟的工作):

  var z;
 randomSource.getRandomBytes(20, function(){z=arguments[0]})
 z
<Buffer c8 64 03 d1 2d 27 7d 8e 8f 14 ec 48 e2 97 46 84 5a d7 c7 2f>
 String(z)
'�d\u0003�-\'}��\u0014�H��F�Z��/'

答案 4 :(得分:0)

如果您使用的是ES6,那么它也很容易

String.fromCharCode(...bytes)
Promise.resolve(String.fromCharCode(...bytes)) // Promise

String.fromCharCode.apply(null, bytes)
Promise.resolve(String.fromCharCode.apply(null, bytes)) // Promise