求Node.js中Buffer.from与位运算逻辑的C#等价实现方案
Node.js位运算逻辑的C#等价实现
问题核心
需要将一段Node.js中基于bitwise库的位运算逻辑转成C#代码,要求最终输出与Node.js的out2完全一致。之前用Encoding.UTF8.GetBytes转字符串为字节数组时结果不符,核心原因是没复现bitwise.buffer.or/xor的循环补位逻辑。
关键逻辑说明
Node.js中的Buffer.from(str)本质是将字符串按UTF-8编码转为字节数组(示例中所有字符均为ASCII范围,UTF-8与ASCII编码结果一致)。而bitwise库的位运算规则是:
- 对两个字节数组按逐字节位运算
- 若两个数组长度不同,会循环复用较短数组的字节,直到长度与较长数组匹配
C#实现代码
using System; using System.Text; public class BitwiseOperations { // 实现bitwise.buffer.or的逻辑:逐字节OR,短数组循环补位 public static byte[] BufferOr(byte[] longer, byte[] shorter) { byte[] result = new byte[longer.Length]; for (int i = 0; i < longer.Length; i++) { result[i] = (byte)(longer[i] | shorter[i % shorter.Length]); } return result; } // 实现bitwise.buffer.xor的逻辑:逐字节XOR,短数组循环补位 public static byte[] BufferXor(byte[] longer, byte[] shorter) { byte[] result = new byte[longer.Length]; for (int i = 0; i < longer.Length; i++) { result[i] = (byte)(longer[i] ^ shorter[i % shorter.Length]); } return result; } public static void Main() { string testkey = "gEracj9I248GF3yS"; string timestamp = "1649302201249"; string testid = "8621349"; // 转UTF-8字节数组,与Node.js Buffer.from结果一致 byte[] testkeyBuffer = Encoding.UTF8.GetBytes(testkey); byte[] timestampBuffer = Encoding.UTF8.GetBytes(timestamp); byte[] testidBuffer = Encoding.UTF8.GetBytes(testid); // 执行OR运算,testkeyBuffer更长(16字节),timestampBuffer(13字节)循环补位 byte[] out1 = BufferOr(testkeyBuffer, timestampBuffer); // 执行XOR运算,out1(16字节),testidBuffer(7字节)循环补位 byte[] out2 = BufferXor(out1, testidBuffer); // 将结果转为字符串(与Node.js输出一致,包含不可见字符) string out2Str = Encoding.UTF8.GetString(out2); Console.WriteLine(out2Str); // 输出应为:OADH@N☻{25:w⌂3yS } }
验证说明
Encoding.UTF8.GetBytes与Buffer.from的编码结果完全一致(示例字符均为ASCII,无多字节字符)BufferOr和BufferXor严格复现了bitwise库的循环补位逻辑,确保位运算结果与Node.js端一致
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

