Привет, я хотел бы реализовать функцию отправки байтового массива из 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
Я не совсем уверен, как конвертировать в правильное значение. Может кто-нибудь помочь.
Спасибо