Как выровнять массив байтов, переданный из Blazor в Typescript через взаимодействие, с размером, кратным 2 байтам?C#

Место общения программистов C#
Ответить
Anonymous
 Как выровнять массив байтов, переданный из Blazor в Typescript через взаимодействие, с размером, кратным 2 байтам?

Сообщение Anonymous »

[РЕДАКТИРОВАТЬ: я скоро обновлю это исправленным кодом]
Я пытаюсь перенести массив шортов в TypeScript из Blazor, используя оптимизацию взаимодействия Blazor Byte-array.
У меня есть следующий метод C#, который я вызываю из JavaScript:

Код: Выделить всё

[JSInvokable]
public static byte[] ReadDataBytes()
{
var byteArray = new byte[10_000]; // Dummy array.
Buffer.BlockCopy(data, 0, byteArray, 0, byteArray.Length);
return byteArray;
}
На стороне TypeScript я вызываю этот метод следующим образом:

Код: Выделить всё

async readData(): Promise
{
const byteArray = await this._dotNetObject.invokeMethodAsync("ReadDataBytes");

console.log(`byteArray.byteOffset is ${byteArray.byteOffset}`);

// Check if the byteArray is properly aligned for Int16Array
if (byteArray.byteOffset % 2 !== 0)
{
const alignedBuffer = new ArrayBuffer(byteArray.byteLength);
const alignedView = new Uint8Array(alignedBuffer);
alignedView.set(byteArray);
return new Int16Array(alignedBuffer);
}

// Convert byte array directly to Int16Array (little-endian) if properly aligned
return new Int16Array(byteArray.buffer, byteArray.byteOffset, byteArray.byteLength / 2);
}

Код: Выделить всё

_dotNetObject
— это DotNet.DotNetObject:

Код: Выделить всё

export declare namespace DotNet {
interface DotNetObject {
invokeMethodAsync(methodIdentifier: string, ...args: any[]): Promise;
invokeMethod(methodIdentifier: string, ...args: any[]): T;
dispose(): void;
}
}
Это работает, но в моих тестах byteArray.byteOffset начинается с 29 для 127 вызовов, затем становится 30 для 128 вызовов и, наконец, становится 31 для всех оставшихся вызовов.
Есть ли способ настроить вещи так, чтобы данные были правильно выровнены по кратному sizeof(short) в ReadDataBytes(), чтобы мне не нужно было копировать данные в выровнять его в readData()?

Подробнее здесь: https://stackoverflow.com/questions/798 ... terop-to-a
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»