[英]Deserializing UTF8 encoded Byte[] in javascript in the browser or in the node.js application?
我在c#中有一個事件類:
public class AreaInterventoCreata{
//public properties
}
var message= new AreaInterventoCreata();
我創建了這個類服務器端的實例。 我的目標是將此創作傳達給已訂閱此類事件的客戶。
因此我將它傳遞給我的經紀人RabbitMQ以下byte[]
:
var responseBody = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message))
responseChannel.BasicPublish(
"", // exchange
properties.ReplyTo, // routingKey
responseProperties, // basicProperties
responseBody); // body
一些node.js服務器訂閱了這種消息:
q.subscribe(function (message) {
for (var i = 0; i < sockets.length; i++) {
console.log('_sockets[' + i + '] emitted');
sockets[i].emit(event, message);
}
});
這個node.js自己收到了來自瀏覽器的socket.io連接,因此可以對這些套接字執行推送,例如這些瀏覽器:
sockets[i].emit(event, message);
最后,我在瀏覽器中收到此消息:
var socket = io.connect('http://localhost:8091');
socket.on('Events_AreaIntervento_AreaInterventoCreata:Events', function (data) {
var json = Utf8.decode(data);
});
當我通過firebug檢查數據時,它是一個對象數據,其數字數組定義為data.data
。
我假設這個數字數組是我在進程開始時給出的字節數組。 這個假設我錯了嗎?
好的,在這個網站的幫助下找到了它(至少是它的一部分)
var Utf8 = {
// public method for url decoding
decodeArray: function (utfArray) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while (i < utfArray.length) {
c = utfArray[i];
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if ((c > 191) && (c < 224)) {
c2 = utfArray[i + 1];
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utfArray[i + 1];
c3 = utfArray[i + 2];
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
像這樣使用
<script>
var socket = io.connect('http://localhost:8091');
socket.on('Events_AreaIntervento_AreaInterventoCreata:Events', function (msg) {
var jsonString = Utf8.decodeArray(msg.data);
alert(jsonString);
});
</script>
但我仍然想知道在客戶端或node.js服務器上執行此操作是否更好,以及如何在node.js服務器上執行此操作?
我之前從未使用過RabbitMQ,但看起來你將JSON字符串從.NET傳遞給RabbitMQ的方式有問題。 您的“responseProperties”可能不正確,因為在nodejs或客戶端上使用JSON之前,您不需要解碼UTF-8陣列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.