2015-08-04 15 views
0

У меня есть шестнадцатеричное число, каккак мы будем кодировать каждый байт как два шестнадцатеричных символа в рубине?

hexMidAppId = '0001000000000002' 

В node.js, у нас есть библиотека new Buffer(hexMidAppId, 'hex'), которая дает мне выход как

<Buffer 00 01 00 00 00 00 00 02> 

теперь тот же вывод, что я хочу, чтобы получить его в рубин, но Я не мог найти эквивалентный метод в ruby ​​для метода Buffer. Может ли кто-нибудь мне помочь?

+0

Это вопрос форматирования (добавьте пробел каждые 2 символа) или вы ищете эквивалент Ruby для класса «Буфер» Node.js (или один из его методов)? – Stefan

+0

Привет, stefan, я ищу эквивалент ruby ​​для node.js Buffer class –

+0

@AjayMehra - в Ruby нет класса Buffer, по крайней мере, не в том же смысле, что javascript использует класс буфера. В Ruby мы используем Strings and Arrays для хранения двоичных данных. Я отредактировал свой ответ, чтобы отразить это. – Myst

ответ

0

У вас на самом деле есть String, и вы хотите вывести его с пробелами между двумя последовательными символами. Таким образом, вы можете сделать сканирование & присоединиться

hexMidAppId.scan(/.{2}/).join(' ') 
+0

Он не хочет выводить его как '', он хочет получить объект с функциональностью JavaScript 'Buffer', последовательность байтов (которая, не имеет значения, выводится как' '). – Amadan

+1

А, ок. Это было ... не очень очевидно. – EugZol

+0

Вопрос помечен тегом [tag: ruby] и [tag: node.js] как по причине; это очевидно для людей, которые знают оба. :) – Amadan

3

В рубин можно использовать String#unpack и Array#pack для них - и многие другие - преобразования.

Для изменения шестнадцатеричной строки в фактических байтов, вы можете поместить его в массив и использовать Array#pack так:

['0001000000000002'].pack 'H*' 
# => this will give: "\x00\x01\x00\x00\x00\x00\x00\x02" 

Что вы получите строку с фактическими байт. Вы можете преобразовать это в массив байтов с помощью:

data = ['0001000000000002'].pack 'H*' 
# => this will give: "\x00\x01\x00\x00\x00\x00\x00\x02" 
data.bytes # => [0, 1, 0, 0, 0, 0, 0, 2] 

P.S.

Класс Buffer в Javascript используется, так как чистый Javascript не является бинарным.

Pure JavaScript Unicode дружественный, но не славный для двоичных данных. При работе с потоками TCP или файловой системой необходимо обрабатывать потоки октетов. Узел имеет несколько стратегий для управления, создания и потребления октетных потоков.

Исходные данные хранятся в экземплярах класса Buffer. Буфер похож на массив целых чисел, но соответствует распределению необработанной памяти вне кучи V8. Буфер не может быть изменен.

В Ruby для хранения двоичных данных можно использовать либо класс String, либо массив, so you will not find a designated "Buffer" class.

В примере:

"\x00\x01\x02" # => A string with 3 bytes, using Hex notation (00, 01, 02) 
"\x00\x01\x02".bytes # => [1,2,3] An array with 3 bytes. 
[1,2,3].pack('C*') # => "\x00\x01\x02" Back to the string 

вы можете также использовать пакет для целых чисел (16bit), лонги (32bit) удваивается (64bit) и другие типы данных:

[1024, 2].pack('i*') # => "\x00\x04\x00\x00\x02\x00\x00\x00" 
0

У меня есть логика в node.js, который я пытаюсь использовать в ruby, но не смог найти соответствующий метод (Buffer()) в ruby.Below - это мой код в node.js, который использует метод крипто-библиотеки createHmac

Я тестировал с ID = 2 и APPID = 1

function generatesomevalue(ID, APPID) { 

    // add zero padding for at the beginning of the number pick lowest 6 bytes 
    var hexMemberId = ('0000000000000000' + ID.toString(16)).substr(-12); 
    console.log(hexMemberId); //000000000002 
    // put APPID into two highest bytes of member id 
    var hexAppId = APPID.toString(16); 
    console.log(hexAppId);//1 
    var hexMidAppId = ('0000' + hexAppId + hexMemberId).substr(-16);//<Buffer 00 01 00 00 00 00 00 02> 
    console.log(hexMidAppId);//0001000000000002 
    var midBuffer = new Buffer(hexMidAppId, 'hex'); 
    console.log(midBuffer);//<Buffer 00 01 00 00 00 00 00 02> 

    var key = 'PLACEHOLDER'; 
    var hmacBuffer = createHMACDigest(key, midBuffer); 
    console.log(hmacBuffer); //01c690ac02eb572fde4a096a076aaa8501ea3671bf 
    var outputBuffer = Buffer.concat([midBuffer, new Buffer(hmacBuffer, 'hex')]); 
    console.log(outputBuffer); //<Buffer 00 01 00 00 00 00 00 02 01 c6 90 ac 02 eb 57 2f de 4a 09 6a 07 6a aa 85 01 ea 36 71 bf> 
    console.log(outputBuffer.toString('base64')); //AAEAAAAAAAIBxpCsAutXL95KCWoHaqqFAeo2cb8= 
    return outputBuffer.toString('base64'); 
} 

функция createHMACDigest (ключ, paddedMemberId) { возвращение '01' + crypto.createHmac ('sha1', ключ) .update (paddedMemberId).дайджеста ('шестигранной'); }

+1

Измените свой вопрос, чтобы добавить дополнительную информацию. – Stefan