【问题标题】:base64 binary decode 32 bit arraybase64 二进制解码 32 位数组
【发布时间】:2018-05-18 03:40:42
【问题描述】:

我得到了一个 32 位大端无符号整数数组,基本上纯文本是这样的[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

那个32位字节序数组本身是用二进制base64编码的AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA==

最初,如果我从天堂收到此消息,那么现在如何将所有内容解码/解压缩为 JavaScript 中可理解的纯文本表示形式。

在 ruby​​ 中,我可以简单地使用 Base64.decodeString#Unpack

encoded_string = 'AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA=='

decoded_string = Base64.strict_decode64(encoded_string)
  => "\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x06\x00\x00\x00\a\x00\x00\x00\b\x00\x00\x00\t\x00\x00\x00\n\x00\x00\x00\v\x00\x00\x00\f\x00\x00\x00\r\x00\x00\x00\x0E\x00\x00\x00\x0F\x00\x00\x00\x10"

decoded_string.unpack('N*') #32-bit unsigned, network (big-endian) byte order
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

在 JavaScript 中是否有相当于这个简单步骤的方法?

【问题讨论】:

标签: javascript base64 endianness


【解决方案1】:

您可以使用ArrayBufferDataView 对给定的字符串进行解码并仅取四个字符以转换为32 位数字

function getInt(string) {
    var view = new DataView(new ArrayBuffer(4)),
        i;

    for (i = 0; i < string.length; i++) {
        view.setUint8(i, string.charCodeAt(i));
    }
    return view.getInt32(0);
}

var encodedData = 'AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA==',
    decodedData = window.atob(encodedData),
    result = [],
    i = 0;

while (i < decodedData.length) {
    result.push(getInt(decodedData.slice(i, i += 4)));
}

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 在节点控制台中是否有等效项?
  • 我不知道节点。
  • 安装atob 包和let atob = require('atob'),而不是window.atob。其余部分无需更改即可工作。
【解决方案2】:

好的,经过严格的搜索后,我找到了这个专门用于此目的的库 - https://www.npmjs.com/package/binary

还提供其他编码

encoded_string = 'AAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEA=='  
let buffer = new Buffer(encoded_string, 'base64');
let arrayList = [];
let binaryList = binary.parse(buffer);
for (var i = 0; i <(buffer.length / 4); i++) {
    arrayList.push(binaryList.word32bu('a').vars.a);
};

【讨论】:

    【解决方案3】:

    第一个 window.atob('AAAAAQA') => '\x00\x00\x00\x01\x02\x03' */

    const encoder = new TextEncoder()
    const view = encoder.encode('\x00\x00\x00\x01\x02\x03')
    console.log(view);
    /* Uint8Array(6) [0, 0, 0, 1, 2, 3] */
    

    这应该是正确的方法!

    【讨论】:

      猜你喜欢
      • 2011-11-02
      • 2017-07-14
      • 2015-06-27
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多