我有一个C ++服务器进程我试图通过TCP连接使用简单的流协议。数据包的前8个字节是以位为单位的消息长度,然后数据包的其余部分是作为字符串的实际消息。连接到所述服务器的C ++客户端进程为此构造消息,如下所示:
char* msgBuff = new char[msgLen + sizeof(int)];
int nlen = htonl(msgLen);
memcpy(msgBuff, &nlen, sizeof(int));
memcpy(msgBuff + sizeof(int), msg, msgLen);
所以我试图在node.js中做同样的事情。我有我的消息字符串,我通过将msglen var转换为表示正确的字节交换十六进制值的字符串来编写我自己的htonl版本。然后我用该字符串执行parseInt以将var作为十六进制值:
var byteSwappedMsgLen = parseInt(lengthAsAString,16);
然后我尝试将此和我的msg写入我的net.socket,如下所示:
soc.write(byteSwappedMsgLen + msg);
但是出了点问题。我的msg长度为210(十六进制为000000d2),我的函数使用byteswapped,使得lengthAsAString = d2000000。但出于某种原因,当我将byteSwappedMsgLen打印到控制台时,它等于3523215360.C ++服务器将其读取为消息长度为859124275.所以我不确定我是否没有转换字符串正确和\或如果我没有正确构建消息。
答案 0 :(得分:0)
想通了我需要使用缓冲区并用前导零填充十六进制值(不需要字节交换)。
namespace BrightMediaTest
{
using System;
using System.Collections.Generic;
public partial class merchant
{
public merchant()
{
this.stores = new HashSet<store>();
}
public long merchantID { get; set; }
public string merchantName { get; set; }
public virtual ICollection<store> stores { get; set; }
}