我在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) 假设我有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)
现在,在这一点上,我无法弄清楚如何将内容写入data新ab缓冲区,因此,最后我有一个ArrayBuffer包含3组数字的开头,以及视频的全部内容.
我尝试使用以下内容:
view.setInt32(10, data.buffer)
虽然我没有错误,但数据实际上并未写入缓冲区.我无法将视频写入文件并播放:
function readPayload(ab) {
var view = new DataView(ab);
console.log(' …Run Code Online (Sandbox Code Playgroud) 给定一个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并不代表同质数据集。
我正在尝试创建对象视图ArrayBuffer以便对其进行 JSONify。
var data = { data: new Uint8Array(arrayBuffer) }
var json = JSON.stringify(data)
Run Code Online (Sandbox Code Playgroud)
看起来,即使是最小的,大小ArrayBuffer也并不重要Uint8Array。到目前为止我没有收到任何 RangeError:) 如果是这样,我如何决定使用哪个类型数组?
我有以下下载文件的请求(使用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
arraybuffer ×5
javascript ×4
node.js ×2
base64 ×1
binary-data ×1
json ×1
typed-arrays ×1
typescript ×1
vue-resource ×1
vue.js ×1