Wie richtet man ein per Interop von Blazor an Typescript übertragenes Byte-Array auf ein Vielfaches von 2 Bytes aus?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie richtet man ein per Interop von Blazor an Typescript übertragenes Byte-Array auf ein Vielfaches von 2 Bytes aus?

Post by Anonymous »

[BEARBEITEN] Diese Frage wurde mit tatsächlich funktionierendem Code aktualisiert.
(Hinweis: In dieser Diskussion geht es um die Art und Weise, wie das Array-Interop funktioniert, was relevant sein könnte.)
Ich versuche, ein Array von Shorts von Blazor mithilfe der Blazor-Byte-Array-Interop-Optimierung auf TypeScript zu übertragen.
Ich habe die folgende C#-Methode, die ich aus JavaScript aufrufe:

Code: Select all

[JSInvokable]
public byte[] ReadDataBytes()
{
var shortArray = new short[1000];  // In real use, this comes from some data source.
var byteArray = new byte[shortArray.Length * sizeof(short)];
Buffer.BlockCopy(shortArray, 0, byteArray, 0, byteArray.Length);
return byteArray;
}
Auf der TypeScript-Seite rufe ich diese Methode folgendermaßen auf:

Code: Select all

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

console.log("byteOffset = ", byteArray.byteOffset);

// Check if the byteArray is properly aligned for Int16Array
if (byteArray.byteOffset % 2 !== 0)
{
// If not aligned, create a new properly aligned buffer
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);
}

Code: Select all

_dotNetObject
ist ein DotNet.DotNetObject:

Code: Select all

export declare namespace DotNet {
interface DotNetObject {
invokeMethodAsync(methodIdentifier: string, ...args: any[]): Promise;
invokeMethod(methodIdentifier: string, ...args: any[]): T;
dispose(): void;
}
}
Das funktioniert, aber in meinen Tests beginnt byteArray.byteOffset für ein paar Aufrufe bei 29, wird dann für einige weitere Aufrufe zu 30 und schließlich für alle verbleibenden Aufrufe zu 31. Ich sehe beispielsweise die folgende Ausgabe an der Browserkonsole:

Code: Select all

7 byteOffset =  29
7 byteOffset =  30
119 byteOffset =  31
Wenn ich den Code entferne, der sich mit einem byteOffset befasst, der kein Vielfaches von 2 ist:

Code: Select all

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

console.log("byteOffset = ", byteArray.byteOffset);

// Convert byte array directly to Int16Array (little-endian)
return new Int16Array(byteArray.buffer, byteArray.byteOffset, byteArray.byteLength / 2);
}
Dann erhalte ich die Fehlermeldung: RangeError: Startoffset von Int16Array sollte ein Vielfaches von 2 sein.
Gibt es eine Möglichkeit, Dinge so zu konfigurieren, dass die Daten in ReadDataBytes() korrekt auf ein Vielfaches von sizeof(short) ausgerichtet werden, sodass ich die Daten nicht kopieren muss, um sie in readData() auszurichten?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post