Javascript 写入NodeJs缓冲区
我正在处理一个JS客户端和C#服务器连接 连接进行得很顺利。当我想从JS客户端向C#server发送缓冲区时,就会出现问题 对于要由我的服务器处理的缓冲区,缓冲区必须具有特定的结构:一个按18字节编码的头,后跟消息 缓冲区包含: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
//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的文本消息