我有这个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更令人失望,但它会存储正确的数据。