0

我有一个十六进制数

hexMidAppId = '0001000000000002'

在 node.js 中,我们有一个库new Buffer(hexMidAppId, 'hex'),它给我的输出为

<Buffer 00 01 00 00 00 00 00 02>

现在相同的输出我想在 ruby​​ 中得到它,但我在 ruby​​ 中找不到任何等效的 Buffer 方法。谁能帮我这个?

4

3 回答 3

4

在 ruby​​ 中,您可以使用String#unpackArray#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"
于 2015-08-04T07:51:56.183 回答
0

您实际上有 String 并且您希望在每两个连续字符之间使用空格输出它。所以,你可以做扫描和加入

hexMidAppId.scan(/.{2}/).join(' ')
于 2015-08-04T07:49:18.443 回答
0

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

于 2015-08-04T08:56:58.770 回答