将c#转换为NodeJS

本文关键字:NodeJS 转换 | 更新日期: 2023-09-27 18:15:30

嗨,所以我试图将这个c#函数转换为NodeJS,但它不工作,我真的不知道是什么错了,让我显示一些代码和输出

c#:

private static byte[] ConvertMsg(byte[] message, byte type = 255, byte cmd = 255)
{
    int msgLength = message.Length;
    byte[] bArray = new byte[msgLength + 3];
    bArray[0] = type;
    bArray[1] = cmd;
    Buffer.BlockCopy(message, 0, bArray, 2, msgLength);
    bArray[msgLength + 2] = 0;
    return bArray;
}
static void Main()
{
    byte[] encrypted = ConvertMsg(Encoding.Default.GetBytes("hi"),3,3);
    Console.WriteLine($"Encrypted: {Convert.ToBase64String(encrypted)}");
    Console.ReadKey();
}
输出:

AwNoaQA=

NodeJS:

function ConvertMsg(message, type=255, cmd=255){
    let length = message.length;
    let bArray = Buffer.alloc(length+3);
    bArray[0] = type;
    bArray[1] = cmd;
    bArray.copy(message,0,length);
    bArray[length + 2] = 0;
    return bArray;
}
let encrypted = ConvertMsg(Buffer.from("hi"),3,3);
console.log(encrypted.toString("base64"));
输出:

AwMAAAA=

正如你所看到的输出是不一样的,非常感谢任何帮助,请解释当你回答我想了解更多,谢谢。

将c#转换为NodeJS

根据Buffer文档,.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

将数据从buf的一个区域复制到目标的一个区域,即使目标内存区域与buf重叠。

这里

// means copy 'bArray' starting from length to 'message' starting from 0
bArray.copy(message, 0, length); 

不复制message的内容到bArray。你做相反的事情——你复制bArray的内容,现在是[3, 3, 0, 0, 0]message,实际上覆盖你的消息。

然后,输出这个bArray,结果是AwMAAAA=,它是[3, 3, 0, 0, 0]的Base64表示。

你可以这样修改你的函数:

function ConvertMsg(message, type=255, cmd=255){
    let length = message.length;
    let bArray = Buffer.alloc(length + 3);
    bArray[0] = type;
    bArray[1] = cmd;
    // means copy 'message' starting from 0 to 'bArray' starting from 2
    message.copy(bArray, 2);
    bArray[length + 2] = 0;
    return bArray;
}