2017-02-14 25 views
0

Я пытаюсь записать Array (1, 2) в двоичный файл в виде байтов. Таким образом, выходной файл должен содержать 00000001 00000010. Я понял, что мне нужно использовать ADODB.Stream, но я не нашел решения для такой простой задачи.Как записать последовательность байтов в двоичный файл с помощью JScript?

var data = new Array(1, 2)  
out = WScript.CreateObject("ADODB.Stream") 
out.Type = 1 
out.Open() 
out.Write(data) 
out.SaveToFile("output.bin", 2) 
out.Close() 

Код выше дает ошибки:

Аргументы неправильного типа, находятся вне допустимого диапазона, или находятся в конфликте друг с другом.

Любые идеи по преобразованию массива данных в приемлемый тип?

+0

ключевой точкой здесь является использование type = text и преобразование кодовой страницы, как описано в статье, связанной с моим ответом. в той же статье вы найдете также обратную функцию _ReadAll_, используйте ее как доказательство концепции, чтобы прочитать сохраненный файл. – deblocker

ответ

1

Вы можете использовать функцию WriteAll, описанную здесь: Reading and Writing Binary Files Using JScript. Авторское право: д-р Александр J Turner.

Обратите внимание: Поток должен иметь текст типа, а затем вам нужно будет сделать текст < -> двоичное преобразование. Я только что проверил весь код, и он отлично работал для меня.

Вот полный пример:

var bf1 = new BinaryFile("C:/Temp/test.bin"); 
var outBuf = ''; 
for(var i=0, l=data.length; i<l; i++) { 
    outBuf += String.fromCharCode(data[i]); 
} 
bf1.WriteAll(outBuf); 

Результат выглядит следующим образом:

enter image description here

EDIT:

Я просто сделал более компактной адаптации кода , чтобы избежать шестнадцатеричного преобразования и двойной петли:

// Codepage conversion table 
var _c=[199,252,233,226,228,224,229,231,234,235,232,239,238,236,196,197, 
     201,230,198,244,246,242,251,249,255,214,220,162,163,165,8359,402, 
     225,237,243,250,241,209,170,186,191,8976,172,189,188,161,171,187, 
     9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488, 
     9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575, 
     9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600, 
     945,223,915,960,931,963,181,964,934,920,937,948,8734,966,949,8745, 
     8801,177,8805,8804,8992,8993,247,8776,176,8729,183,8730,8319,178,9632,160], 
    _w=[], 
    _r=[]; 

// Create forward lookup to write & reverse lookup to read 
for(var i=0, l=256; i<l; i++) { 
    var c = (i<128) ? i : _c[i-128]; 
    _w[i] = c; 
    _r[c] = i; 
} 

// Read binary data from disk  
function binFileToArray(fileName, binArray){ 
    var inStream = new ActiveXObject("ADODB.Stream"); 
    inStream.Type = 2; 
    inStream.CharSet = '437'; 
    inStream.Open(); 
    inStream.LoadFromFile(fileName); 
    var inString = inStream.ReadText(); 
    inStream.Close(); 
    for(var i=0, l=inString.length; i<l; i++) { 
     binArray.push(_r[inString.charCodeAt(i)]); 
    } 
} 

// Write binary data to disk 
function binArrayToFile(binArray, fileName){ 
    var outStream = new ActiveXObject('ADODB.Stream'); 
    var outString = ''; 
    for(var i=0, l=binArray.length; i<l; i++) { 
     outString += String.fromCharCode(_w[binArray[i]]); 
    } 
    outStream.Type = 2; 
    outStream.CharSet = '437'; 
    outStream.Open(); 
    outStream.WriteText(outString); 
    outStream.SaveToFile(fileName, 2); 
    outStream.Close(); 
} 

// TEST: read binary file from disk & write array back to disk 

var testArray = []; 
binFileToArray('c:/temp/test.bin', testArray); 
binArrayToFile(testArray, 'c:/temp/test2.bin'); 

// both files equals