NodeJS将二进制缓冲区写入文件

49

我无法重写从二进制缓冲区获取的文件,我已经检查过原始文件,所有字节都相同。

这是从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上运行它,发现结果是错误的。

我该如何修复它?


1
你的问题有点不清楚。你是在Node.js中复制二进制文件,而复制品与原始文件的字节完全相同?那么你的问题是什么,看起来它已经正常工作了。 - PherricOxide
是的,写入这些字节是有效的,但如果您检查两个文件之间的差异,您会发现一些问号而不是点。 这使得文件无用,因为您无法看到图像。 我想的是我必须使用不同的编码。 - max246
8
这可能只是十六进制编辑器因文件扩展名不同而显示不同。原始字节没有编码(除了大端和小端,这似乎不是你的问题)。 - PherricOxide
有任何解决方案吗? - Kowsigan Atsayam
3个回答

47

我不确定这样是否有帮助,但是尝试在下面的代码行中将变量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!");
    }
});

如果是图像文件而不是文本文件怎么办?我尝试过在Postman中运行,但输出的结果是乱码。这是因为我在Postman中尝试了吗?然而,有人告诉我你可以接收图像文件。 - LordDraagon

7
你可以尝试这个方法:
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);

2
我尝试了一下,它在创建的文件中写入了 [object Object]。 - Kumar Ravi

0

尝试使用Buffer.byteLength(string | buffer..)来处理长度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接