0

私は16進数を持っています

hexMidAppId = '0001000000000002'

node.js には、次のようなnew Buffer(hexMidAppId, 'hex')出力を提供するライブラリがあります。

<Buffer 00 01 00 00 00 00 00 02>

同じ出力をルビーで取得したいのですが、ルビーで Buffer メソッドと同等のメソッドが見つかりませんでした。誰でもこれを手伝ってもらえますか?

4

3 に答える 3

4

ruby では、String#unpackArray#packを使用して、これらの (および他の多くの) 変換を行うことができます。

16 進文字列を実際のバイトに変更するには、配列内に配置して次の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]

PS

Buffer純粋な Javascript はバイナリ フレンドリーではないため、Javascriptのクラスが使用されます。

Pure JavaScript は Unicode に適していますが、バイナリ データには適していません。TCP ストリームまたはファイル システムを扱う場合、オクテット ストリームを処理する必要があります。ノードには、オクテット ストリームを操作、作成、および消費するためのいくつかの戦略があります。

生データは Buffer クラスのインスタンスに格納されます。Buffer は整数の配列に似ていますが、V8 ヒープ外の raw メモリ割り当てに対応しています。Buffer はサイズ変更できません。

Ruby では、バイナリ データを格納するために String クラスまたは Array のいずれかを使用できるため、指定された「Buffer」クラスは見つかりません

例:

"\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

integer (16 ビット)、long (32 ビット)、double (64 ビット)、およびその他のデータ型にも pack を使用できます。

[1024, 2].pack('i*') # => "\x00\x04\x00\x00\x02\x00\x00\x00"
于 2015-08-04T07:51:56.183 に答える
0

私はRubyで試しているnode.jsにロジックを持っていますが、Rubyで関連するメソッド(Buffer())を見つけることができませんでした。以下は、暗号ライブラリメソッドcreateHmacを使用するnode.jsの私のコードです

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');
}

function createHMACDigest(key, paddedMemberId) { return '01' + Crypto.createHmac('sha1', key).update(paddedMemberId).digest('hex'); }

于 2015-08-04T08:56:58.770 に答える