gpt4 book ai didi

javascript - Blazor 到 Javascript 字节数组互操作

转载 作者:行者123 更新时间:2023-12-05 01:33:27 27 4
gpt4 key购买 nike

我正在尝试将 byte 数组从 Blazor Client 传递给 javascript 函数:

private async void ShowImage()
{
SelectedImageBytes = await GetImageData();
if (SelectedImageBytes.Any())
{
ReceivedDataLength = SelectedImageBytes.Length;
//ReceivedDataLength is 131072, which is correct
JS.InvokeVoidAsync("JS.setImage", SelectedImageBytes, 256, 256);

}

StateHasChanged();
}

在 Javascript 方面:

function setImage(data, width, height)
{
console.log("On Javascript I have received an array of " + data.length);
//data.length is 174764
console.log(data);

//...
}

console.log(data) 输出如下:

enter image description here

在我看来,这似乎是我的二进制数据的 base64 字符串表示形式。根据维基百科,从字节数组到 base64 字符串表示,大小大约增加了 33%,对于这种情况也是如此:131072 * 1.33 ~ 174764

我的问题是:

  • 如何在不将字节数组转换为字符串的情况下从 Blazor (C#) 向 Javascript 传递和接收字节数组
  • 如果前一个不可能,那么在 Javascript 端将 base64 字符串转换为字节数组的最佳方法是什么。

最佳答案

我又试了一次:

C#

public void CallJsUnMarshalled()
{
var unmarshalledRuntime = (IJSUnmarshalledRuntime)JS;
unmarshalledRuntime.InvokeUnmarshalled<byte[], int>("JsFunctions.MyFunctionUnmarshalled", MyBytes);
}

Javascript:

function MyFunctionUnmarshalled(bytes)
{
const dataPtr = Blazor.platform.getArrayEntryPtr(bytes, 0, 4);
const length = Blazor.platform.getArrayLength(bytes);
var shorts = new Int16Array(Module.HEAPU8.buffer, dataPtr, length);
return 0;
}

InvokeUnmarshalled 需要返回它出现,因此模板参数中的 int。取而代之的是,可能必须返回对该对象的引用才能对其进行处理。如果有人可以对此发表评论,我将不胜感激(当不再使用字节数组时,javascript 会释放该内存吗?)。

首次测试显示提高了 50 倍!

关于javascript - Blazor 到 Javascript 字节数组互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64803155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com