2015-11-21 72 views
0

我有問題,將事我知道在Ruby中的Javascript作品(node.js的在這種情況下,但我想在瀏覽器支持的解決方案,如果可能的話)的Javascript十六進制Base32編碼

給定十六進制格式的SHA256摘要的:通過運行一個快速例程十六進制轉換爲交流

"BMEN72AKJFEQVYDSFOJQN72TYWVTKUWRPECYCTTGRDXGFQ3T" 

我可以在Ruby中做到這一點:

"0b08dfe80a49490ae0722b9306ff53c5ab3552d17905814e6688ee62c373" 

將其轉換爲base32表示,看起來像這樣字符代碼字符串,然後base32編碼。我似乎無法在JavaScript中找到類似的方法。似乎沒有可靠的方法來獲取字符代碼或Base32編碼。

Ruby代碼作爲一個例子,我只是分塊的十六進制在超時1個字符,並做一個快速六角形>小數 - >字符轉換:

s = "0b08dfe80a49490ae0722b9306ff53c5ab3552d17905814e6688ee62c373" 
s2 = s.scan(/../).map { |x| x.hex.chr }.join 
s3 = Base32.encode(s2) 

中介的字符串看起來像:

"\v\b\xDF\xE8\nII\n\xE0r+\x93\x06\xFFS\xC5\xAB5R\xD1y\x05\x81Nf\x88\xEEb\xC3s\x8AM" 
+0

'parseInt()'和'Number.prototype.toString()'函數都帶有一個可選的基本參數。他們不能處理那些大的數字。 – Pointy

+0

看看https://github.com/agnoster/base32-js –

+0

請記住,有幾個'base32'規範。它看起來像你使用[RFC 4648「base32」](https://tools.ietf.org/html/rfc4648#page-9),但我知道的大多數JS實現使用[RFC 4648「base32hex」]( https://tools.ietf.org/html/rfc4648#page-10)或[Douglas Crockfords Base32](http://www.crockford.com/wrmg/base32.html)。 –

回答

2

請記住,有幾個base32規範。

它看起來像你正在使用RFC 4648 "base32",但我知道的大多數JS實現使用RFC 4648 "base32hex"Douglas Crockfords Base32

我知道RFC 4648「base32」的唯一JS實現是hi-base32

這裏是hex(又名base16)字符串轉換爲RFC 4648 base32與它的一個例子:

var base32 = require('hi-base32'); 

var s = "0b08dfe80a49490ae0722b9306ff53c5ab3552d17905814e6688ee62c373"; 
var s2 = base32.encode(new Buffer(s, 'hex')); 
// => 'BMEN72AKJFEQVYDSFOJQN72TYWVTKUWRPECYCTTGRDXGFQ3T' 

但是如果你想在瀏覽器中使用hi-base32你有你的hex字符串轉換爲字節數組:

var s = "0b08dfe80a49490ae0722b9306ff53c5ab3552d17905814e6688ee62c373"; 
if (s.length % 2 !== 0) { 
    // odd number of characters 
    s = '0' + s; 
} 
var bytes = []; 
for (var i = 0; i < s.length; i = i + 2) { 
    bytes.push(parseInt(s.slice(i, i + 2), 16)); 
} 
var s2 = base32.encode(bytes);