通过websocket将字节数组从c#发送到angular
嗨,我想实现一个功能,通过websocket将字节数组从C#发送到我的Angular 7。基本上,我有一个用C#运行的websocket,我的前端是用Angular7编写的 请注意,以下示例是一个简化的示例。在我的实际应用程序中,我要发送的对象包含大约400个字段。将对象序列化为json字符串后,大约为6kb。另外,我需要在大约一秒钟内发送30个这样的对象。发送二进制数据将显著减少包的大小并加快速度 在C#中,我有这样的示例代码来生成websocket的有效负载:通过websocket将字节数组从c#发送到angular,c#,angular,binary,C#,Angular,Binary,嗨,我想实现一个功能,通过websocket将字节数组从C#发送到我的Angular 7。基本上,我有一个用C#运行的websocket,我的前端是用Angular7编写的 请注意,以下示例是一个简化的示例。在我的实际应用程序中,我要发送的对象包含大约400个字段。将对象序列化为json字符串后,大约为6kb。另外,我需要在大约一秒钟内发送30个这样的对象。发送二进制数据将显著减少包的大小并加快速度 在C#中,我有这样的示例代码来生成websocket的有效负载: public class Te
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
作为{“Obj”:“aaaaaa clcjz8ovghliezpcnn0ifrlc3q=“}
我猜Obj
的值是testsbyteraray
的base64编码值
现在,在我的前端,我可以接收json字符串。问题是如何将aaaaaaa clcjz8ovghliezpcnn0ifrlc3q=
转换回与角度中的Test
格式相同的对象
我尝试的是:
我尝试使用下面的函数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;
}
我不确定如何转换为正确的值。有人能帮忙吗
谢谢在不同的平台和语言之间发送二进制数据是脆弱的,很难做到正确。我建议在发送之前转换为平台无关的表示(比如JSON数组),然后在另一端转换回来 比如说,
string a = JsonConvert.SerializeObject(tests);
你能展示你已经实现的完整c#逻辑吗?你想做什么?你不能仅仅通过网络发送一个二进制blob,然后期望一种不同的编程语言能够处理它。我理解得对吗?您正在向Angular应用程序发送
JSON
。在Angular中,您想将其转换为字节[]
?请参见输出上的b64解码,您只收到您发送的内容,它是b64编码的。问题是您正在写入二进制数据。。您需要自己处理才能获得正确的值。我认为你可以找到更好的方法来解决你的问题。为什么不简单地序列化测试呢?因此,您不需要手动提取书面值有效载荷=新有效载荷{Obj=测试};字符串a=JsonConvert.SerializeObject(有效负载)```谢谢@Rodney,我实际上需要每33毫秒发送一个6kb的对象。将对象序列化为字符串非常慢,因为它太大了。这就是为什么我想发送二进制数据。
string a = JsonConvert.SerializeObject(tests);