私は16進数を持っています
hexMidAppId = '0001000000000002'
node.js には、次のようなnew Buffer(hexMidAppId, 'hex')
出力を提供するライブラリがあります。
<Buffer 00 01 00 00 00 00 00 02>
同じ出力をルビーで取得したいのですが、ルビーで Buffer メソッドと同等のメソッドが見つかりませんでした。誰でもこれを手伝ってもらえますか?
私は16進数を持っています
hexMidAppId = '0001000000000002'
node.js には、次のようなnew Buffer(hexMidAppId, 'hex')
出力を提供するライブラリがあります。
<Buffer 00 01 00 00 00 00 00 02>
同じ出力をルビーで取得したいのですが、ルビーで Buffer メソッドと同等のメソッドが見つかりませんでした。誰でもこれを手伝ってもらえますか?
ruby では、String#unpackとArray#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"
私は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'); }