Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeJS write binary buffer into a file

I can't rewrite a file that I am getting from a binary buffer, I have checked with the original file and all bytes are the same.

This is the file create from 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.����ӵ| 

This the original one:

$ 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.......| 

You can compare these two files and every bytes are the same, I am guessing that the encoding from NodeJS is not the right one.

This is the piece of code

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!");     } }); 

You can try to run it on your NodeJS and see that the result is wrong.

What can I do to fix it?

like image 554
max246 Avatar asked Oct 12 '12 22:10

max246


People also ask

How do I write a binary file in node JS?

writeFile("test. txt", b, "binary",function(err) { if(err) { console. log(err); } else { console. log("The file was saved!"); } });

CAN node js write to file?

Writing to a file is another of the basic programming tasks that one usually needs to know about - luckily, this task is very simple in Node. js. We can use the handy writeFile method inside the standard library's fs module, which can save all sorts of time and trouble.

How do you convert a buffer to a string value in node JS?

Buffers have a toString() method that you can use to convert the buffer to a string. By default, toString() converts the buffer to a string using UTF8 encoding. For example, if you create a buffer from a string using Buffer. from() , the toString() function gives you the original string back.

Which method is used for writing to buffer in Node JS?

The write() method writes the specified string into a buffer, at the specified position.


2 Answers

I am not sure if this would help but try to change the b variable to the bytes variable in the line below at least you would be able to view the file in a test editor

fs.writeFile("test.txt", b,  "binary",function(err) { }); 

If you would like to have the numbers space separated try the code below:

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!");     } }); 
like image 200
Mohamed Alimam Avatar answered Sep 28 '22 01:09

Mohamed Alimam


You can try this:

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); 
like image 38
Pedro Rodrigues Avatar answered Sep 28 '22 03:09

Pedro Rodrigues