NodeJS相当于C二进制写

时间:2016-03-21 22:13:52

标签: c arrays node.js binary fwrite

我有这个C代码将数组转储到二进制文件中:

#include <stdio.h>
#include <string.h>

struct Person {
    char name[256];
    double num1;
    double num2;
};

int main(int argc, const char * argv[]) {
    struct Person ary[2];

    strcpy(ary[0].name, "john");
    ary[0].num1 = 25;
    ary[0].num2 = 50;

    strcpy(ary[1].name, "jane");
    ary[1].num1 = 100;
    ary[1].num2 = 200;

    FILE *out = fopen("test.dat", "w+b");

    fwrite(ary, sizeof(ary), 1, out);
    fclose(out);

    return 0;
}

是否有办法将Node数组中的对象或字符串和数组转换为二进制文件。

示例数组:

var ary1 = [100, 2000, 50, 20000, 300, 8000];  // <<< this one I can do

var ary2 = ['John', 'jane', 'jim', 'joe']; // <<< not sure about this one

// this is what I ultimately want to write to binary file
var ary3 = [
  ['john', 25, 50],
  ['jane', 100, 200]
];

请记住,我们希望用二进制文件来创建更小的数据文件。 将所有内容写成字符串很简单,但这不是我需要的。

我的例子没有说明它,但是当我必须编写数百万个整数和浮点数时,二进制数据就派上用场了。

这是我的nodejs编写简单数字数组的代码:

var fs = require('fs');

var ary = [];

for(var i = 0; i < 1000; i++) {
    ary.push(i * 100000);
}

var str = JSON.stringify(ary);

fs.writeFileSync('test.txt', str);

var fd = fs.openSync('test.dat', 'w');

var buff = new Buffer(ary);

fs.write(fd, buff, 0, buff.length, 0, function(err, written) {
    console.log('err', err);
    console.log('written', written);
});

上面的代码创建了两个文件: test.txt的大小应该是8886字节 test.dat的大小应为1000字节。

如果我可以将ary2或ary3写入二进制文件,那就太好了。

由于

更新:修复代码以将正确的数据写入缓冲区和二进制文件

var buff = new Buffer(ary)将创建一个Uint8数组。 Uint8的最大值为255.这会强制高于255的所有值为x MOD 256。

这是新代码:

var fs = require('fs');

// This block writes the values into the buffer
// 1000 elements times 4 bytes per element for 
var length = 1000;
var buff = new Buffer(length * 4);
for(var i = 0; i < length; i++) {
    buff.writeUInt32LE(i * 100000, i * 4);
}

var fd = fs.openSync('test.dat', 'w');
fs.write(fd, buff, 0, buff.length, 0, function(err, written) {
    console.log('err', err);
    console.log('written', written);
});

这应该创建一个4000字节的二进制文件。比1000更令人失望,但它会存储正确的数据。

0 个答案:

没有答案