哪个性能更好?
我正在获取数据并将其发布到不同的网址,我可以发送两种类型,但我应该选择哪一种?数据是pdf文件
我正在从 html canvas 获取图像,并希望将这些图像转换为视频。寻找漫长而艰苦。只是想拍几张照片并将它们制作成视频。我设法将多个图像传递给库引擎,它返回给我一个数组缓冲区。
我的问题:
如何获取数组缓冲区并在视频标签中播放它或将其转换以便可以播放。
根据要求:
//You can simply call:
var frames = [];//array to hold each image/frame url
frames.push(canvas.toDataURL('image/png'));//get the data url from canvas
Run Code Online (Sandbox Code Playgroud)
但我的问题更多地涉及使用 arraybuffer 作为视频标签的 uri。
我有一个 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) 我在我的项目中使用exceljs和 Typescript。但writeBuffer()函数返回ExcelJS.Buffer而不是Buffer类型。并且由于ExcelJS.Buffer继承自ArrayBuffer,转换ArrayBuffer为Buffer将破坏 Excel 文件。有人有解决这个问题的办法吗?提前致谢!
declare interface Buffer extends ArrayBuffer { }
Run Code Online (Sandbox Code Playgroud)
let resultExcel: Buffer; // buffer
const tmpResultExcel: ExcelJS.Buffer = await tmpWorkBook.xlsx.writeBuffer(); // arraybuffer
resultExcel = Buffer.from(tmpResultExcel); // doesn't work well
Run Code Online (Sandbox Code Playgroud) Offset is outside the bounds of the DataView我收到以下代码的错误
let data = [...] // some array of Int16
let buf = new ArrayBuffer(data.length);
let dataView = new DataView(buf);
data.forEach((b, i) => {
dataView.setInt16(i, b);
});
Run Code Online (Sandbox Code Playgroud)
这是 Chrome 中的调试视图
你可以看到它i是47999并且我的缓冲区大小DataView是48000。我在这里缺少什么?
使用 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对象中)保存到IndexedDB中?
IndexedDB规范没有提到ArrayBuffer - 这是否意味着不支持(我必须将ArrayBuffer打包为字符串或数组?).
我需要对ArrayBuffer的一部分进行随机播放,最好是就地,因此不需要复制.例如,如果ArrayBuffer有10个元素,并且我想要移动元素3-7:
// Unshuffled ArrayBuffer of ints numbered 0-9
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
// Region I want to shuffle is between the pipe symbols (3-7)
0, 1, 2 | 3, 4, 5, 6, 7 | 8, 9
// Example of how it might look after shuffling
0, 1, 2 | 6, 3, 5, 7, 4 | 8, 9
// Leaving us with a partially shuffled ArrayBuffer
0, 1, 2, 6, 3, 5, 7, 4, 8, …Run Code Online (Sandbox Code Playgroud) 我正在研究一个需要将大文件上传到服务器端的项目.我决定使用HTML5 FileReader和jQuery以块(ArrayBuffer)上传文件.
我通过将块转换为base64字符串成功完成了此任务,通过jQuery.post使用JSON格式的data参数发送到后端服务器.
例如
$.ajax({
url: "/Home/Upload",
type: "POST",
data: {
name: block.name,
index: block.index,
base64: base64
},
processData: true
});
Run Code Online (Sandbox Code Playgroud)
但我想优化此代码,因为base64太大而无法转换.我想知道我是否可以直接发送ArrayBuffer $.ajax.
我知道如果我设置processData: false并将ArrayBuffer放入数据参数,它可以发送到我的服务器端Request.InputStream.但是通过这种方式我无法附加其他数据,例如name和index.
我想知道我可以在一次ajax调用中将原始ArrayBuffer(或blob,二进制文件)与我的其他数据(名称,索引)一起发送.
arraybuffer ×10
javascript ×6
blob ×3
binary-data ×1
buffer ×1
exceljs ×1
file-upload ×1
firefox ×1
html ×1
html5 ×1
http ×1
indexeddb ×1
jquery ×1
node.js ×1
random ×1
salesforce ×1
scala ×1
shuffle ×1
web-worker ×1