NodeJS 将二进制缓冲区写入文件
Posted
技术标签:
【中文标题】NodeJS 将二进制缓冲区写入文件【英文标题】:NodeJS write binary buffer into a file 【发布时间】:2012-10-03 19:14:22 【问题描述】:我无法重写从二进制缓冲区获取的文件,我检查了原始文件并且所有字节都相同。
这是从 NodeJS 创建的文件:
# hd test.txt | head
00000000 47 49 46 38 39 61 32 00 32 00 f7 00 00 96 8c 73 |GIF89a2.2.�....s|
00000010 66 5e 45 c6 bb 9f 7b 72 5a 47 47 47 8a 81 65 ca |f^Eƻ.rZGGG..e�|
00000020 c1 a6 c9 c1 ac ee ea dd c8 c5 bc 8c 87 7a d3 c9 |���������ż..z��|
00000030 ab 43 3b 26 eb e5 d1 fa fa fa e5 e4 e2 a6 9d 83 |�C;&����������..|
00000040 86 7e 67 c1 b4 8e e4 dc c6 82 82 82 e1 dd d1 e3 |.~g��.���...����|
00000050 dd ca e4 da bc f5 f1 e6 26 25 25 9c 91 73 f8 f3 |���ڼ���&%%..s��|
00000060 e4 c3 b9 9d d3 ca b4 4a 42 2a d1 c6 a2 6c 62 46 |�ù.�ʴJB*�ƢlbF|
00000070 ea e6 db bb b3 9c db d3 bb 5c 54 3d f1 ee e6 dc |��ۻ�.�ӻ\T=����|
00000080 da d3 e7 e4 dc ce c2 9f f8 f6 f2 76 6c 53 fc fb |�������.���vlS��|
00000090 f9 e9 e1 ca 17 13 09 67 4d 00 f8 f4 e8 dc d3 b5 |����...gM.����ӵ|
这是原版:
$ hd runner_small.gif | head
00000000 47 49 46 38 39 61 32 00 32 00 f7 00 00 96 8c 73 |GIF89a2.2......s|
00000010 66 5e 45 c6 bb 9f 7b 72 5a 47 47 47 8a 81 65 ca |f^E...rZGGG..e.|
00000020 c1 a6 c9 c1 ac ee ea dd c8 c5 bc 8c 87 7a d3 c9 |.............z..|
00000030 ab 43 3b 26 eb e5 d1 fa fa fa e5 e4 e2 a6 9d 83 |.C;&............|
00000040 86 7e 67 c1 b4 8e e4 dc c6 82 82 82 e1 dd d1 e3 |.~g.............|
00000050 dd ca e4 da bc f5 f1 e6 26 25 25 9c 91 73 f8 f3 |........&%%..s..|
00000060 e4 c3 b9 9d d3 ca b4 4a 42 2a d1 c6 a2 6c 62 46 |.......JB*...lbF|
00000070 ea e6 db bb b3 9c db d3 bb 5c 54 3d f1 ee e6 dc |.........\T=....|
00000080 da d3 e7 e4 dc ce c2 9f f8 f6 f2 76 6c 53 fc fb |...........vlS..|
00000090 f9 e9 e1 ca 17 13 09 67 4d 00 f8 f4 e8 dc d3 b5 |.......gM.......|
你可以比较这两个文件,每个字节都是一样的,我猜NodeJS的编码不正确。
这是一段代码
var foo = "71%73%70%56%57%97%50%0%50%0%247%0%0%150%140%115%102%94%69%198%187%159%123%114%90%71%71%71%138%129%101%202%193%166%201%193%172%238%234%221%200%197%188%140$"
var bytes = foo.split("%");
var b = new Buffer(bytes.length);
for (var i = 0;i < bytes.length;i++)
b[i] = bytes[i];
fs.writeFile("test.txt", b, "binary",function(err)
if(err)
console.log(err);
else
console.log("The file was saved!");
);
你可以尝试在你的 NodeJS 上运行,看看结果不对。
我能做些什么来解决它?
【问题讨论】:
你的问题有点不清楚。您正在 nodejs 中复制二进制文件,并且副本的字节与原始文件相同?那你有什么问题,看来它工作正常。 是的,写入这些字节是有效的,但是如果您检查两个文件之间的差异,您会看到有一些问号而不是点。这使文件无用,因为您看不到图像。我在想的是我必须使用不同的编码 可能只是因为文件扩展名不同,十六进制编辑器显示的内容不同吗?没有原始字节的编码(缺少大端与小端,这似乎不是你的问题)。 任何解决方案??? 【参考方案1】:我不确定这是否有帮助,但尝试将 b 变量更改为下面行中的 bytes 变量,至少您可以在测试编辑器中查看该文件
fs.writeFile("test.txt", b, "binary",function(err) );
如果您想用空格分隔数字,请尝试以下代码:
var fs = require('fs');
var foo = "71%73%70%56%57%97%50%0%50%0%247%0%0%150%140%115%102%94%69%198%187%159%123%114%90%71%71%71%138%129%101%202%193%166%201%193%172%238%234%221%200%197%188%140"
var bytes = foo.split("%");
var b = new Buffer(bytes.length);
var c = "";
for (var i = 0;i < bytes.length;i++)
b[i] = bytes[i];
c = c + " " + bytes[i]
fs.writeFile("test.txt", c, "binary",function(err)
if(err)
console.log(err);
else
console.log("The file was saved!");
);
【讨论】:
如果它是图像文件而不是文本文件怎么办。我试过了,它在邮递员中返回乱码输出。是因为我在邮递员中尝试过吗?但是,有人告诉我,您可以接收图像文件。【参考方案2】:你可以试试这个:
var writeFileSync = function (path, buffer, permission)
permission = permission || 438; // 0666
var fileDescriptor;
try
fileDescriptor = fs.openSync(path, 'w', permission);
catch (e)
fs.chmodSync(path, permission);
fileDescriptor = fs.openSync(path, 'w', permission);
if (fileDescriptor)
fs.writeSync(fileDescriptor, buffer, 0, buffer.length, 0);
fs.closeSync(fileDescriptor);
// then writeFileSync('path_to_your_file', your_buffer);
【讨论】:
我试过了,它在创建的文件中写入了[object Object]。【参考方案3】:尝试使用 Buffer.byteLength(string | buffer..) 来处理长度。
【讨论】:
以上是关于NodeJS 将二进制缓冲区写入文件的主要内容,如果未能解决你的问题,请参考以下文章