Node.js中如何将Buffer转换为整数数组?含C#字节数组传输场景
解决Node.js将Buffer转回C#发送的Double数组问题
首先得明确:你之前用[...buf]或者Array.prototype.slice.call(buf, 0)拿到的只是Buffer里单个字节的数值(0-255),但原来的double是由8个字节组合而成的,所以直接拆成字节数组肯定拿不到原本的数值。Node.js的Buffer提供了专门的方法来读取多字节的数值类型,刚好能解决这个问题。
核心思路
C#默认以**小端字节序(Little Endian)**将double数组转为字节数组,所以我们需要在Node.js里按相同的字节序,每次读取8个字节(double的固定长度)来还原每个数值。
代码实现(转回Double数组)
function convertBufferToDoubles(buf) { const result = []; // 每个double占用8个字节,循环步长设为8 for (let i = 0; i < buf.length; i += 8) { // 读取小端字节序的double值,对应C#的默认输出 const doubleValue = buf.readDoubleLE(i); result.push(doubleValue); } return result; } // 使用示例:假设你的buf是从C#接收的Buffer const originalDoubles = convertBufferToDoubles(buf); console.log(originalDoubles); // 这就是你C#里原有的double数组
如果需要转回整数数组
如果原double数组里存储的都是整数(比如C#里的double数组实际存的是整数值),可以在读取后转成整数,注意根据需求选择合适的转换方式:
function convertBufferToIntsFromDoubles(buf) { const result = []; for (let i = 0; i < buf.length; i += 8) { const doubleValue = buf.readDoubleLE(i); // 可选:Math.round(四舍五入)、Math.floor(向下取整)、parseInt(截断小数) result.push(Math.round(doubleValue)); } return result; }
注意字节序的匹配
如果你的C#代码特意用了大端字节序(Big Endian)来转换字节数组,那么只需要把readDoubleLE换成readDoubleBE即可。
内容的提问来源于stack exchange,提问作者Vicci Garner
相关产品推荐
相关产品推荐

