标签: arraybuffer

如何将arraybuffer转换为字符串

我在node.js上编写了一个简单的TCP服务器,将一些数据发送到Chrome应用程序.在chrome应用程序中,当我获取数据时,我使用下面的函数将其转换为字符串,我得到一个异常" Uint16Array的字节长度应该是2的倍数 "

String.fromCharCode.apply(null, new Uint16Array(buffer))
Run Code Online (Sandbox Code Playgroud)

我找不到任何可能导致此问题以及如何解决此问题的信息.任何关于此的指示都非常感谢.

以下是node.js服务器中用于将数据发送到客户端的代码:

socket.on('data', function(data) {

    console.log('DATA ' + socket.remoteAddress + ': ' + data);
    // Write the data back to the socket, 
    //   the client will receive it as data from the server
    var r= socket.write('from server\r\n');

});
Run Code Online (Sandbox Code Playgroud)

以下是chrome app的代码:

  chrome.sockets.tcp.onReceive.addListener(function (info) {
            console.log('onListener registered');
            if (info.socketId != socketid)
                return;
            else {
                try {

                   data = ab2str(info.data);
                    console.log(data);
                }
                catch (e) {
                    console.log(e);
                }

            }
            // info.data is an arrayBuffer.
        });

 function ab2str(buf) { …
Run Code Online (Sandbox Code Playgroud)

javascript node.js arraybuffer google-chrome-app

1
推荐指数
2
解决办法
9071
查看次数

读取/写入/将ArrayBuffer复制到具有偏移量的另一个ArrayBuffer中

假设我有ArrayBuffer一个mp4文件.我想创建一个ArrayBuffer带有一些额外字节的新函数作为头信息,然后将mp4缓冲区存储在新的剩余部分中ArrayBuffer.

// ... assume the `data` variable is an existing ArrayBuffer with the contents
// of the mp4 video file.

var ab = new ArrayBuffer(10 + data.byteLength)
var view = new DataView(ab);

view.setInt32(0, 29102); // header information 1
view.setInt32(4, 18282); // header information 2
view.setInt16(8, 576); // header information 3
Run Code Online (Sandbox Code Playgroud)

现在,在这一点上,我无法弄清楚如何将内容写入dataab缓冲区,因此,最后我有一个ArrayBuffer包含3组数字的开头,以及视频的全部内容.

我尝试使用以下内容:

view.setInt32(10, data.buffer)

虽然我没有错误,但数据实际上并未写入缓冲区.我无法将视频写入文件并播放:

function readPayload(ab) {
    var view = new DataView(ab);
    console.log(' …
Run Code Online (Sandbox Code Playgroud)

javascript binary-data node.js arraybuffer

1
推荐指数
1
解决办法
1342
查看次数

将base64字符串转换为ArrayBuffer的有效方法

给定一个base64字符串,创建ArrayBuffer. 特别是纯现代 JavaScript 中的无类型数组缓冲区。

第一个 SO 结果是2014 年的这个问题。接受的答案是

function _base64ToArrayBuffer(base64) {
    var binary_string = window.atob(base64);
    var len = binary_string.length;
    var bytes = new Uint8Array(len);
    for (var i = 0; i < len; i++) {
        bytes[i] = binary_string.charCodeAt(i);
    }
    return bytes.buffer;
}
Run Code Online (Sandbox Code Playgroud)

它已经假定了一种类型,并且有评论表明这并不总是正确的。

今天这仍然是最好的解决方案吗?我们是否必须迭代 for 循环中的所有元素?使用 vanilla JS 是否有更好、更有效的方法来传递blob字符串的 a ?

一个示例问题是处理作为编码字符串提供的GLTF 缓冲区base64

let str = 'data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=';
Run Code Online (Sandbox Code Playgroud)

它有两个单独的标量(无符号短整型)和vec3(浮点)数据视图,需要进一步处理。

[编辑]

因此,最流行的答案在这里没有用,因为它创建了 aTypedArray但字符串中的数据base64并不代表同质数据集。

javascript base64 arraybuffer

1
推荐指数
1
解决办法
6151
查看次数

如何决定使用哪种类型数组?

我正在尝试创建对象视图ArrayBuffer以便对其进行 JSONify。

var data = { data: new Uint8Array(arrayBuffer) }
var json = JSON.stringify(data)
Run Code Online (Sandbox Code Playgroud)

看起来,即使是最小的,大小ArrayBuffer也并不重要Uint8Array。到目前为止我没有收到任何 RangeError:) 如果是这样,我如何决定使用哪个类型数组?

javascript json typed-arrays arraybuffer

0
推荐指数
1
解决办法
397
查看次数

如何从数组缓冲区获取错误消息

我有以下下载文件的请求(使用vue-resource):

this.$http.get(fileUrl, { responseType: 'arraybuffer' }).
    then(
        (response) => {
            let blob = new Blob([response.data], { type: response.headers.get('content-type') });
            let link = document.createElement('a');
            link.setAttribute("type", "hidden");
            link.href = window.URL.createObjectURL(blob);
            let disposition = response.headers.get('content-disposition');
            let matches = /.*filename=(.*);.*/.exec(disposition);
            let filename = (matches != null && matches[1])
                ? matches[1]
                : 'file';
            if (filename.startsWith('"')
                && filename.endsWith('"')) {
                filename = filename.substr(1, filename.length - 2);
            }
            link.download = filename;
            document.body.appendChild(link);
            link.click();
            link.remove();
        },
        (errorResponse) => {
            // TODO: errorResponse doesn't actually have the error …
Run Code Online (Sandbox Code Playgroud)

extract-error-message arraybuffer typescript vue.js vue-resource

0
推荐指数
1
解决办法
3484
查看次数