使用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字节数组?
在服务器上:我正在加载一个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)
没有在画布上显示任何内容.关于我做错了什么的任何想法?
如何缩短(从前面)一组音频 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
这里的答案让我开始了解如何使用 ArrayBuffer:
但是,他们有很多不同的方法。主要是这样的:
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) 我试图从服务器接收一个将包装在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.但是,如果我设置responseType为arrayBuffer,我将获得一个arrayBuffer数组,如何将其转换为JSON,同时仍然能够提取pdf:
我收到的JSON格式如下:
{
result: true,
value: <the pdf byte array>,
errorMessage: null
}
Run Code Online (Sandbox Code Playgroud) 我想使用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) 我正在使用范围请求从大型二进制文件中读取许多 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位浮点值?非常感谢您的帮助。
我有一个 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) 使用 Fetch API,我能够为大量二进制数据资产(比如超过 500 MB)发出网络请求,然后将其转换Response为 aBlob或ArrayBuffer.
之后,我可以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使用postMessage. 请注意,这些堆都不包含 656 MB。
后两个快照是在我使用 aFileReader实际访问底层数据之后拍摄的,并且正如预期的那样,堆增长了很多。
现在,这就是直接作为一个 fetch 发生的情况ArrayBuffer:
在这里,由于二进制数据只是通过工作线程传输,主线程的堆很小,但工作堆包含全部 656 …
我正在使用 Rest API 获取附件正文。
\nvar 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\nRun Code Online (Sandbox Code Playgroud)\n我正在获取这种格式的 PDF 数据
\n%PDF-1.5\n%\xc3\x93\xc3\xb4\xc3\x8c\xc3\xa1\n1 0 obj\n<<\nRun 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) arraybuffer ×10
javascript ×8
blob ×3
websocket ×2
ajax ×1
angularjs ×1
binary-data ×1
dataview ×1
encoding ×1
image ×1
java ×1
jquery ×1
json ×1
multipart ×1
node.js ×1
png ×1
salesforce ×1
typed-arrays ×1
utf-8 ×1
web-worker ×1