2012-10-12 18 views
13

Nie mogę przepisać pliku, który otrzymuję z bufora binarnego, sprawdziłem z oryginalnym plikiem i wszystkie bajty są takie same.NodeJS zapisuje bufor binarny do pliku

ten plik utworzyć z 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.����ӵ| 

Ten oryginalny jednego:

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

Można porównać te dwa pliki i co bajty są takie same, ja domyślam się, że kodowanie z NodeJS nie jest właściwy.

To jest kawałek kodu

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

Można spróbować go uruchomić w NodeJS i zobaczyć, że wynik jest zły.

Co mogę zrobić, aby to naprawić?

+1

Twoje pytanie jest nieco niejasne. Kopiujesz plik binarny w nodejs, a kopia jest identyczna z oryginałem? Jakie jest twoje pytanie, wygląda na to, że działa dobrze. – PherricOxide

+0

Tak, pisanie tych bajtów działa, ale jeśli sprawdzisz różnicę między tymi dwoma plikami, zobaczysz, że istnieje jakiś ZNAK PYTAŃ zamiast punktu. To sprawia, że ​​plik jest bezużyteczny, ponieważ nie widać obrazu. Myślę, że muszę użyć innego kodowania – max246

+3

Czy to może być edytor heksadecymalny wyświetlający rzeczy inaczej, ponieważ rozszerzenia plików są różne? Nie ma kodowania z surowymi bajtami (w przeciwieństwie do big endian vs little endian, co nie wydaje się być twoim problemem). – PherricOxide

Odpowiedz

10

Nie jestem pewien, czy to pomoże, ale spróbować zmienić wartość zmiennej B do zmiennej bajtów w wierszu poniżej przynajmniej będzie można wyświetlić plik w edytorze testu

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

Jeśli chcesz mieć przestrzeń liczb oddzielonych wypróbować poniższy kod:

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

można spróbować to:

var writeFile = 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 writeFile('path_to_your_file', your_buffer);