标签: arraybuffer

使用ajax将Proto-buf消息发送到Java服务器

使用https://github.com/dcodeIO/ProtoBuf.js/我将要发送到java服务器的消息编码为名为batch的ByteBuffer:

batch:
  ByteBuffer {array: ArrayBuffer, view: DataView, offset: 0, markedOffset: -1, length: 139…}
    array: ArrayBuffer
    length: 139
    littleEndian: false
    markedOffset: -1
    offset: 0
    view: DataView
    __proto__: Object
Run Code Online (Sandbox Code Playgroud)

现在我想用jquery的Ajax发送它:

  $.ajax({
    url: myUrl,
    type: 'POST',
    data : batch,
    contentType: 'application/protobuf',
    accept: 'application/json'
  })
Run Code Online (Sandbox Code Playgroud)

但我似乎无法做到这一点.上面的代码给了我jquery异常:

Uncaught TypeError: Cannot set property 'littleEndian' of undefined myScript.js:1353
ByteBuffer.LE bunk.js:1353
jQuery.param.add jquery.js:7203
buildParams jquery.js:7261
jQuery.param jquery.js:7223
jQuery.extend.ajax
Run Code Online (Sandbox Code Playgroud)

如果我从批处理(batch.toArrayBuffer())获得数组缓冲区,Java服务器什么也得不到

ByteStreams.toByteArray(req.getInputStream());
Run Code Online (Sandbox Code Playgroud)

我应该如何编码ByteBuffer来发送这样的?我应该如何将其解码为java字节数组?

java ajax jquery protocol-buffers arraybuffer

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

在websocket上发送png图像并渲染接收到的图像

在服务器上:我正在加载一个png图像:

var myimage = png.load('test.png');

then sending over websocket connection:
ws.send(myimage);
Run Code Online (Sandbox Code Playgroud)

在客户端:

function onMessage(evt) {
    if (evt.data instanceof ArrayBuffer) {
        var length = evt.data.byteLength;
        var bytes = new Uint8Array(evt.data);
        var image = document.getElementById("image");
        var img = new Image();
        img.src = 'data:image/png;base64,'+ window.btoa(bytes);
        var ctx = image.getContext("2d");
        ctx.drawImage(img, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

没有在画布上显示任何内容.关于我做错了什么的任何想法?

png image websocket arraybuffer

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

修剪或剪切用 mediarecorder JS 录制的音频

要求的知识

如何缩短(从前面)一组音频 blob 并仍然具有可播放的音频。

目标

我最终尝试使用 JS MediaRecorder API录制连续 45 秒的音频循环。用户将能够按下按钮,最后 45 秒的音频将被保存。我可以很好地录制、播放和下载单个录音。

问题

当我有一个chunks来自 MediaRecorder的数组称为1000 个 blob 并使用chunks.slice(500, 1000)生成的 blob 数组时,不能用于播放或下载音频。

奇怪的是chunks.slice(0,500)仍然可以正常工作。

代码

let chunks = [];

navigator.mediaDevices.getUserMedia({ audio: true })
  .then((stream) => {
    const mediaRecorder = new MediaRecorder(stream);
    mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
  }

// At some later time, attempt to trim
const trimmedAudio = chunks.slice(500, 1000)
const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
const audioURL = URL.createObjectURL(blob); …
Run Code Online (Sandbox Code Playgroud)

javascript typed-arrays arraybuffer mediarecorder web-audio-api

7
推荐指数
0
解决办法
2223
查看次数

如何将 UTF8 ArrayBuffer 转换为 UTF16 JavaScript 字符串

这里的答案让我开始了解如何使用 ArrayBuffer:

在字符串和 ArrayBuffers 之间转换

但是,他们有很多不同的方法。主要是这样的:

function ab2str(buf) {
  return String.fromCharCode.apply(null, new Uint16Array(buf));
}

function str2ab(str) {
  var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
  var bufView = new Uint16Array(buf);
  for (var i=0, strLen=str.length; i<strLen; i++) {
    bufView[i] = str.charCodeAt(i);
  }
  return buf;
}
Run Code Online (Sandbox Code Playgroud)

我想澄清一下 UTF8 和 UTF16 编码之间的区别,因为我不是 100% 确定这是正确的。

所以在 JavaScript 中,据我所知,所有字符串都是 UTF16 编码的。但是您在自己的 ArrayBuffer 中可能拥有的原始字节可以采用任何编码。

所以说我已经从 XMLHttpRequest 向浏览器提供了一个 ArrayBuffer,来自后端的那些字节是 UTF8 编码的:

var r = new XMLHttpRequest()
r.open('GET', '/x', …
Run Code Online (Sandbox Code Playgroud)

javascript encoding utf-8 arraybuffer

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

如何在JSON中接收字节数组

我试图从服务器接收一个将包装在JSON中的pdf.

如果我只是将pdf的字节数组发送到前端,我可以通过设置responseType来正确读取它arraybuffer,然后我可以通过以下方式下载pdf:

var blob = new Blob([data], { type: application/pdf});
    if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
        $window.navigator.msSaveOrOpenBlob(blob);
    } else {
        var a = document.createElement("a");
        document.body.appendChild(a);
        var fileURL = URL.createObjectURL(blob);
        a.href = fileURL;
        a.download = fileName;
        a.click();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当服务器尝试发送带有bytearray的JSON时,如果我设置为responseTypeto JSON,那么我将无法转换blob.但是,如果我设置responseTypearrayBuffer,我将获得一个arrayBuffer数组,如何将其转换为JSON,同时仍然能够提取pdf:

我收到的JSON格式如下:

{
  result: true,
  value: <the pdf byte array>,
  errorMessage: null
}
Run Code Online (Sandbox Code Playgroud)

javascript json arraybuffer angularjs

7
推荐指数
2
解决办法
1030
查看次数

在 WebSocket (ws) 上接收一个 ArrayBuffer

我想使用ws处理从客户端收到的 ArrayBuffer 消息。客户端,由于ws.binaryType,我直接收到了一个 ArrayBuffer,但服务器端,我没有收到一个 ArrayBuffer 而是这样的(字符串?): '< Buffer 00 00 2a 00 00 00 00 00 00 00 00 00 00 00 00 00>'。

服务器如何接收 ArrayBuffer ?

客户端 :

var ws = new WebSocket("ws://localhost:3000/");
ws.binaryType = 'arraybuffer';
ws.onopen = function() {
    var buffer = new ArrayBuffer(15);
    var dv = new DataView(buffer);
    dv.setInt16(1, 42);
    ws.send(buffer);
};
Run Code Online (Sandbox Code Playgroud)

服务器端 :

var express = require('express'),
app = express(),
server = require('http').createServer(),
WebSocketServer = require('ws').Server,
wss = new WebSocketServer({
    server: …
Run Code Online (Sandbox Code Playgroud)

javascript dataview websocket node.js arraybuffer

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

具有多个范围请求的Javascript Fetch API获取二进制Float32Array数据

我正在使用范围请求从大型二进制文件中读取许多 32 位浮点数,不幸的是,我需要从该文件中获得的浮点数位于文件的不同部分,因此我需要对多个范围进行范围请求

fetch("http://example.com/largeBinaryFile.bin", {
        headers: {
            'content-type': 'multipart/byteranges',
            'range': 'bytes=2-5,10-13',
        },
    })
    .then(response => {
        if (response.ok) {
            return response.text();
        }
    })
    .then(response => {
        console.log(response);
    });
Run Code Online (Sandbox Code Playgroud)

由于有多个范围,我必须使用文本而不是 arrayBuffer,当我打印出响应时,我得到

--00000000000000000002
Content-Type: application/octet-stream
Content-Range: bytes 2-5/508687874

1ȹC
--00000000000000000002
Content-Type: application/octet-stream
Content-Range: bytes 10-13/508687874

þC
--00000000000000000002--
Run Code Online (Sandbox Code Playgroud)

如您所见,二进制数据位于不同的部分,我尝试使用 Blob 和 FileReader 将数据转换为 arrayBuffer 并用 Float32Array 包装,但没有成功。请问如何从multiparts中获取32位浮点值?非常感谢您的帮助。

javascript blob multipart arraybuffer

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

使用 TextDecoder/TextEncoder 将 ArrayBuffer 转换为 String 然后返回到 ArrayBuffer 返回不同的结果

我有一个 ArrayBuffer,它是通过使用 Frida 读取内存返回的。我正在将 ArrayBuffer 转换为字符串,然后使用 TextDecoder 和 TextEncoder 将其转换回 ArrayBuffer,但是在此过程中结果正在改变。解码和重新编码后的 ArrayBuffer 长度总是更大。是否有广泛的字符解码?

如何在不丢失完整性的情况下将 ArrayBuffer 解码为字符串,然后返回到 ArrayBuffer?

示例代码:

var arrayBuff = Memory.readByteArray(pointer,2000); //Get a 2,000 byte ArrayBuffer

console.log(arrayBuff.byteLength); //Always returns 2,000

var textDecoder = new TextDecoder("utf-8");
var textEncoder = new TextEncoder("utf-8");

//Decode and encode same data without making any changes
var decoded = textDecoder.decode(arrayBuff);
var encoded = textEncoder.encode(decoded);

console.log(encoded.byteLength); //Fluctuates between but always greater than 2,000
Run Code Online (Sandbox Code Playgroud)

javascript arraybuffer

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

将一个大的 blob 复制给工人是否昂贵?

使用 Fetch API,我能够为大量二进制数据资产(比如超过 500 MB)发出网络请求,然后将其转换Response为 aBlobArrayBuffer.

之后,我可以worker.postMessage让标准结构化克隆算法将其复制Blob到 Web Worker 或将其ArrayBuffer转移到工作器上下文(使主线程不再有效)。

起初,似乎将数据作为ArrayBuffera获取会更可取,因为 aBlob不可传输,因此需要复制。但是,blob 是不可变的,因此,浏览器似乎没有将其存储在与页面关联的 JS 堆中,而是存储在专用的 blob 存储空间中,因此,最终被复制到工作线程上下文的内容只是一个参考。

我准备了一个演示来尝试两种方法之间的区别:https : //blobvsab.vercel.app/。我正在使用这两种方法获取价值 656 MB 的二进制数据。

我在本地测试中观察到的一些有趣的事情是,复制 Blob 甚至比传输 更快ArrayBuffer

Blob 从主线程到工作线程的复制时间:1.828125 毫秒

ArrayBuffer 从主线程到工作线程的传输时间:3.393310546875 毫秒

这是一个强有力的指标,表明处理 Blob 实际上非常便宜。由于它们是不可变的,浏览器似乎足够聪明,可以将它们视为引用,而不是将覆盖的二进制数据链接到这些引用。

以下是我在作为 a 获取时拍摄的堆内存快照Blob

以 blob 形式获取二进制数据时堆内存检查器的屏幕截图

前两个快照是在Blob使用postMessage. 请注意,这些堆都不包含 656 MB。

后两个快照是在我使用 aFileReader实际访问底层数据之后拍摄的,并且正如预期的那样,堆增长了很多。

现在,这就是直接作为一个 fetch 发生的情况ArrayBuffer

获取二进制数据作为数组缓冲区时堆内存检查器的屏幕截图

在这里,由于二进制数据只是通过工作线程传输,主线程的堆很小,但工作堆包含全部 656 …

javascript blob web-worker arraybuffer

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

当我打开 Salesforce 附件时,它已下载,但 pdf 为空

我正在使用 Rest API 获取附件正文。

\n
var config = {\n                method: 'get',\n                url: '<Domanin>/services/data/v48.0/sobjects/Attachment/00PD000000HQD68MAH/Body',\n                headers: {\n                    'Authorization': `Bearer ${\n                        accessToken\n                    }`,\n                    'content-type':'application/pdf'\n                },\n            };\n\n       let rawData = await axios(config);\n       rawData = rawData.data\n\n\n
Run Code Online (Sandbox Code Playgroud)\n

我正在获取这种格式的 PDF 数据

\n
%PDF-1.5\n%\xc3\x93\xc3\xb4\xc3\x8c\xc3\xa1\n1 0 obj\n<<\n
Run Code Online (Sandbox Code Playgroud)\n

在客户端,我试图将其作为可下载文件,但我得到的是空白 pdf。实际的 pdf 包含 2 页,下载的 pdf 也包含两页,但它们是空白的。

\n

客户端代码:

\n
 var downloadLink = document.createElement('a');\n            downloadLink.target = '_blank';\n            downloadLink.download = 'test.pdf';\n\n            // convert downloaded data to a Blob\n            var blob = new Blob(([rawData]), {type: 'application/pdf'});\n\n            // create an object URL …
Run Code Online (Sandbox Code Playgroud)

javascript blob salesforce binary-data arraybuffer

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