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

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

Сообщение Anonymous »

Я пытаюсь перенести массив коротких фрагментов в TypeScript из Blazor, используя оптимизацию взаимодействия Blazor Byte-array.
У меня есть следующий метод C#, который я вызываю из JavaScript:

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

[JSInvokable]
public static byte[] ReadDataBytes(short[] data)
{
var byteArray = new byte[data.Length * sizeof(short)];
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#»