Отправить байтовый массив от c# до angular через websocket - PullRequest
0 голосов
/ 10 февраля 2020

Привет, я хотел бы реализовать функцию отправки байтового массива из C# в Angular 7 через websocket. По сути, у меня есть websocket, работающий с C#, а мой интерфейс написан на Angular7.

Обратите внимание, следующий пример является упрощенным. В моем реальном приложении объект, который я собираюсь отправить, содержит около 400 полей. После сериализации объекта в строку json он составляет около 6 КБ. Кроме того, мне нужно отправить 30 таких объектов примерно за одну секунду. Отправка двоичных данных значительно уменьшит размер пакета и ускорит его.

В C# у меня есть пример кода для генерации полезной нагрузки веб-сокета:

public class Test
{
    public int Id { get; set; }
    public float Value { get; set; }
    public string Description { get; set; }
}

public class Payload
{
    public object Obj { get; set; }
}

Test[] tests = new Test[]
{
    new Test
    {
         Id = 0,
         Value = 1.12f,
         Description = "The First Test"
    }
};


    byte[] testsByteArray;
    using (MemoryStream m = new MemoryStream())
    {
        using (BinaryWriter binaryWriter = new BinaryWriter(m))
        {
            foreach (Test test in tests)
            {
                binaryWriter.Write(test.Id);
                binaryWriter.Write(test.Value);
                binaryWriter.Write(test.Description);
            }
        }
    testsByteArray = m.ToArray();
}

Payload payload = new Payload
{
    Obj = testsByteArray
};

string a = JsonConvert.SerializeObject(payload);

В конце концов я получил a as {"Obj":"AAAAAClcjz8OVGhlIEZpcnN0IFRlc3Q="} Я предполагаю, что значение Obj является закодированным base64 значением testsByteArray.

Теперь в моем интерфейсе я могу получить строку json. Вопрос в том, как преобразовать AAAAAClcjz8OVGhlIEZpcnN0IFRlc3Q= обратно в объект того же формата, что и Test в Angular.

Что я пробовал:

Я пытался использовать следующую функцию atob() для декодирования base64, а затем используйте следующую функцию для преобразования декодированной строки в байтовый массив

str2ab(str): ArrayBuffer {
    var buf: ArrayBuffer = new ArrayBuffer(str.length * 2); // 2 bytes for each char
    var bufView = new Uint16Array(buf);
    for (var i = 0, strLen = str.length; i < strLen; i++) {
      bufView[i] = str.charCodeAt(i);
    }
    return buf;
}

Затем я пытаюсь использовать следующий код для получения значений

let dataView = new DataView(arrayBuffer);
console.log(dataView.getInt32(0));  // = 0
console.log(dataView.getInt32(2));  // = 0
console.log(dataView.getInt32(4));  // = 0
console.log(dataView.getInt32(6));  // = 10496

Я не совсем уверен, как конвертировать в правильное значение. Может кто-нибудь помочь.

Спасибо

1 Ответ

0 голосов
/ 10 февраля 2020

Отправка двоичных данных между различными платформами и языками - от agile, и с ней трудно разобраться. Я бы предложил перед отправкой преобразовать в представление c агности платформы (например, массив JSON) и выполнить обратное преобразование на другой стороне.

Например,

string a = JsonConvert.SerializeObject(tests);
...