我有一个十六进制数
hexMidAppId = '0001000000000002'
在 node.js 中,我们有一个库new Buffer(hexMidAppId, 'hex')
,它给我的输出为
<Buffer 00 01 00 00 00 00 00 02>
现在相同的输出我想在 ruby 中得到它,但我在 ruby 中找不到任何等效的 Buffer 方法。谁能帮我这个?
我有一个十六进制数
hexMidAppId = '0001000000000002'
在 node.js 中,我们有一个库new Buffer(hexMidAppId, 'hex')
,它给我的输出为
<Buffer 00 01 00 00 00 00 00 02>
现在相同的输出我想在 ruby 中得到它,但我在 ruby 中找不到任何等效的 Buffer 方法。谁能帮我这个?
在 ruby 中,您可以使用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]
附言
使用 Javascript 中的Buffer
类是因为纯 Javascript 不是二进制友好的。
纯 JavaScript 对 Unicode 友好,但对二进制数据不友好。在处理 TCP 流或文件系统时,需要处理八位字节流。Node 有几种用于操作、创建和使用八位字节流的策略。
原始数据存储在 Buffer 类的实例中。Buffer 类似于整数数组,但对应于 V8 堆外的原始内存分配。缓冲区无法调整大小。
在 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
您还可以将 pack 用于整数(16 位)、长整数(32 位)双精度(64 位)和其他数据类型:
[1024, 2].pack('i*') # => "\x00\x04\x00\x00\x02\x00\x00\x00"
您实际上有 String 并且您希望在每两个连续字符之间使用空格输出它。所以,你可以做扫描和加入
hexMidAppId.scan(/.{2}/).join(' ')
我在node.js中有一个逻辑,我在ruby中尝试,但在ruby中找不到相关方法(Buffer())。下面是我在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');
}
function createHMACDigest(key, paddedMemberId) { return '01' + Crypto.createHmac('sha1', key).update(paddedMemberId).digest('hex'); }