Javascript 写入NodeJs缓冲区

Javascript 写入NodeJs缓冲区,javascript,node.js,Javascript,Node.js,我正在处理一个JS客户端和C#服务器连接 连接进行得很顺利。当我想从JS客户端向C#server发送缓冲区时,就会出现问题 对于要由我的服务器处理的缓冲区,缓冲区必须具有特定的结构:一个按18字节编码的头,后跟消息 缓冲区包含: 消息大小为8字节 8字节的消息ID 消息类型为2字节 在以前的版本中,我使用C#客户机发送这个缓冲区。我这样说: //Header parameters ulong ID = ulong.MaxValue; ushort type = 0; //Message str

我正在处理一个JS客户端和C#服务器连接

连接进行得很顺利。当我想从JS客户端向C#server发送缓冲区时,就会出现问题

对于要由我的服务器处理的缓冲区,缓冲区必须具有特定的结构:一个按18字节编码的头,后跟消息

缓冲区包含:

  • 消息大小为8字节
  • 8字节的消息ID
  • 消息类型为2字节
  • 在以前的版本中,我使用C#客户机发送这个缓冲区。我这样说:

    //Header parameters
    ulong ID = ulong.MaxValue;
    ushort type = 0;
    
    //Message
    string message = "This is the message";
    byte[] encodedMessage = Encoding.ASCII.GetBytes(message);
    
    //Encoding the header and add header to buffer
    byte[] buffer = new byte[encodedMessage.Length + 18];
    Array.Copy(BitConverter.GetBytes(encodedMessage.LongLength + 18), 0, buffer, 0, 8);
    Array.Copy(BitConverter.GetBytes(ID), 0, buffer, 8, 8);
    Array.Copy(BitConverter.GetBytes((uint)type), 0, buffer, 16, 2);
    
    //Adding the message to the buffer
    Array.Copy(encodedMessage, 0, buffer, 18, encodedMessage.Length);
    
    标题信息通过C#BitConverter.GetBytes()函数进行转换

    我想在NodeJs中也这样做

    我这样做:

    var msg = "This is the message"
    
    var size = 18 + msg.length
    
    var buffer = new ArrayBuffer(size)
    var buf = Buffer.from(buffer);
    
    // Writting the header
    buf.write(str(size-18),0,8) // Write the message size
    buf.write("123456",8,8) // Write the id
    buf.write("0",16,2) // Write the message type
    
    //Adding the message to the buffer
    buf.write(msg,18,msg.length)
    
    但是,通过这种方式,头不会像上面的C#函数那样被转换成比特

    在nodejs中有这样做的方法吗?

    您可以使用该方法初始化长度为18字节的标头缓冲区。然后用如下方式写入数据,最后用内容缓冲区连接头缓冲区:

    const content = "This is the message";
    const headerBuffer = Buffer.alloc(18);
    headerBuffer.write(Buffer.from(content, 'ascii').byteLength.toString(), 0, 8);
    headerBuffer.write("1234", 8, 8);
    headerBuffer.write("0", 16, 2);
    const contentBuffer = Buffer.from(content, 'ascii');
    const result = Buffer.concat([headerBuffer, contentBuffer]);
    
    将此缓冲区写入文件并用
    hextump
    显示它将导致:

    $ hexdump -C tmp 
    00000000  31 39 00 00 00 00 00 00  31 32 33 34 00 00 00 00  |19......1234....|
    00000010  30 00 54 68 69 73 20 69  73 20 74 68 65 20 6d 65  |0.This is the me|
    00000020  73 73 61 67 65                                    |ssage|
    00000025
    
    您可以使用初始化长度为18字节的标头缓冲区。然后用如下方式写入数据,最后用内容缓冲区连接头缓冲区:

    const content = "This is the message";
    const headerBuffer = Buffer.alloc(18);
    headerBuffer.write(Buffer.from(content, 'ascii').byteLength.toString(), 0, 8);
    headerBuffer.write("1234", 8, 8);
    headerBuffer.write("0", 16, 2);
    const contentBuffer = Buffer.from(content, 'ascii');
    const result = Buffer.concat([headerBuffer, contentBuffer]);
    
    将此缓冲区写入文件并用
    hextump
    显示它将导致:

    $ hexdump -C tmp 
    00000000  31 39 00 00 00 00 00 00  31 32 33 34 00 00 00 00  |19......1234....|
    00000010  30 00 54 68 69 73 20 69  73 20 74 68 65 20 6d 65  |0.This is the me|
    00000020  73 73 61 67 65                                    |ssage|
    00000025
    

    您可以使用
    buffer.alloc
    方法为缓冲区分配字节数。该方法采用一个整数,该整数将指示缓冲区的长度。如果您使用new关键字创建缓冲区,那么您正在使用引擎盖下的
    buffer.allocUnsafe
    方法,因此建议不使用new关键字创建缓冲区。说到这里,我想出了一个解决办法

    const msg = 'This is a message'
    const buffer = Buffer.alloc(18)
    let bytesWritten = 0;
    
    // Write the first 8 bytes
    bytesWritten += buffer.write(msg, 0, 8)
    console.log('I wrote ',bytesWritten,' bytes');
    // Write the next 8 bytes
    bytesWritten += buffer.write(msg, (buffer.length - bytesWritten), 8);
    console.log('I have now written ',bytesWritten,' bytes');
    // Write the remaining 2 bytes
    buffer.write(msg, (buffer.length - bytesWritten), 2);
    
    

    您可以使用
    buffer.alloc
    方法为缓冲区分配字节数。该方法采用一个整数,该整数将指示缓冲区的长度。如果您使用new关键字创建缓冲区,那么您正在使用引擎盖下的
    buffer.allocUnsafe
    方法,因此建议不使用new关键字创建缓冲区。说到这里,我想出了一个解决办法

    const msg = 'This is a message'
    const buffer = Buffer.alloc(18)
    let bytesWritten = 0;
    
    // Write the first 8 bytes
    bytesWritten += buffer.write(msg, 0, 8)
    console.log('I wrote ',bytesWritten,' bytes');
    // Write the next 8 bytes
    bytesWritten += buffer.write(msg, (buffer.length - bytesWritten), 8);
    console.log('I have now written ',bytesWritten,' bytes');
    // Write the remaining 2 bytes
    buffer.write(msg, (buffer.length - bytesWritten), 2);
    
    

    如果他只想写18个字节,为什么要分配18423个字节?谢谢你的回答,但我不明白你为什么要把大小乘以18?缓冲区包含大小为18的标头和最大大小为1024的文本消息如果他只想写入18个字节,为什么要分配18423个字节?谢谢你的回答,但我不明白你为什么要将大小乘以18?缓冲区包含大小为18的标头和最大大小为1024的文本消息