2012-10-12 39 views
13

Tôi không thể ghi lại tệp mà tôi nhận được từ bộ đệm nhị phân, tôi đã kiểm tra với tệp gốc và tất cả các byte đều giống nhau.NodeJS ghi bộ đệm nhị phân vào một tệp

Đây là tập tin tạo ra từ 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.����ӵ| 

này ban đầu:

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

Bạn có thể so sánh hai tập tin này và mỗi byte là như nhau, tôi đoán rằng mã hóa từ NodeJS không phải là một trong những quyền.

Đây là đoạn mã

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

Bạn có thể thử chạy nó trên NodeJS của bạn và thấy rằng kết quả là sai.

Tôi có thể làm gì để khắc phục sự cố?

+1

Câu hỏi của bạn có một chút không rõ ràng. Bạn đang sao chép một tập tin nhị phân trong nodejs, và bản sao là byte giống với bản gốc? Câu hỏi của bạn là gì, có vẻ như nó hoạt động tốt. – PherricOxide

+0

Có, viết các byte này đang hoạt động nhưng nếu bạn kiểm tra sự khác biệt giữa hai tệp, bạn có thể thấy rằng có một số dấu QUESTION MARK thay vì điểm. Điều này làm cho tệp này vô dụng vì bạn không thể nhìn thấy hình ảnh. Điều tôi đang nghĩ là tôi phải sử dụng một mã hóa khác nhau – max246

+3

Có thể nó chỉ là trình chỉnh sửa hex hiển thị mọi thứ khác nhau vì các phần mở rộng tệp khác nhau? Không có mã hóa với byte nguyên (ngắn của endian lớn vs ít endian, mà dường như không phải là vấn đề của bạn). – PherricOxide

Trả lời

10

Tôi không chắc chắn nếu điều này sẽ giúp đỡ, nhưng cố gắng thay đổi biến b vào biến byte trong dòng thấp hơn ít nhất bạn sẽ có thể xem các tập tin trong một trình soạn thảo thử nghiệm

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

Nếu bạn muốn có không gian số tách thử đoạn code dưới đây:

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

bạn có thể thử này:

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); 
Các vấn đề liên quan