如何从 Node.js 中的二进制字符串中解压缩数据?

Posted

技术标签:

【中文标题】如何从 Node.js 中的二进制字符串中解压缩数据?【英文标题】:How do I unpack a data from a binary string in Node.js? 【发布时间】:2021-07-28 16:12:27 【问题描述】:

php 中你可以这样做:

$raw_data = base64_decode("1Xr5WEtvrApEByOh4GtDb1nDtls");
$unpacked = unpack('Vx/Vy', $raw_data);

/* output:
  array(2) 
    ["x"]=>
    int(1492744917)
    ["y"]=>
    int(179072843)
  
*/ 

如何在 Node.js 中实现相同的结果?

到目前为止,我已经尝试过:

const base64URLDecode = (data) => 
  let buffer
  data = data.replace(/-/g, '+').replace(/_/g, '/')

  while (data.length % 4) 
    data += '='
  

  if (data instanceof Buffer) 
    buffer = data
   else 
    buffer = Buffer.from(data.toString(), 'binary')
  

  return buffer.toString('base64')


const byteToUINT8 = (bytes) => 
  const byteLength = bytes.length
  const uint8Arr = new Uint8Array(byteLength)

  return uint8Arr.map((char, key) => bytes.charCodeAt(key))


const unpack = (binString) => 
  const byteChars = base64URLDecode(binString)
  const uint8Arr = byteToUINT8(byteChars)
  const uint32Arr = new Uint32Array(uint8Arr.buffer)

  return uint32Arr


unpack('1Xr5WEtvrApEByOh4GtDb1nDtls') // output: [1180980814, 2036880973, ...]

但是,与 PHP 的 unpack 相比,这给了我一个完全不匹配的结果。我做错了什么?

【问题讨论】:

【参考方案1】:

查看这个 sn-p:

 const buf = Buffer.from("1Xr5WEtvrApEByOh4GtDb1nDtls", 'base64')
 const uint32array =  new Uint32Array(buf.buffer, buf.byteOffset, buf.length / Uint32Array.BYTES_PER_ELEMENT)
 // Variable uint32array presents:
 // Uint32Array(5) [
 // 1492744917,
 // ... ]

关于 Nodejs TypedArray 的文档在这里:Nodejs Buffer

【讨论】:

以上是关于如何从 Node.js 中的二进制字符串中解压缩数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ruby 从二进制字符串中解包一点

如何在 Perl 中解压缩双精度值?

使用 ZipFile 类从多个文件的 zip 存档中解压缩文件

PHP:从二进制数据流中解压缩32位整数

如何从多个 tar 文件中解压缩特定文件并压缩它们?

如何在水壶中解压缩和导入 .tar.gz 文件?