代码之家  ›  专栏  ›  技术社区  ›  Cheeso

如何在javascript(cscript.exe)中读取二进制文件?

  •  5
  • Cheeso  · 技术社区  · 15 年前

    我想我不能用scripting.filesystemobject类读取二进制文件。 我可以用adodb.stream来做吗?

    还有别的吗?

    我想得到一个字节数组。

    谢谢。

    6 回复  |  直到 9 年前
        1
  •  5
  •   Cheeso    15 年前

    它还可以将文件作为二进制文件读取,然后使用vbscript将返回的对象(变量数组)转换为一个javascript字节数组。为此,您需要使用.wsf文件将vbscript和javascript混合在一起。您仍然需要adodb.stream。

    <job id="Something">
      <script id="BFRHelper.vbs" language="VBScript">
        Public Function VbBinaryToArray(Binary)
            Dim i
            ReDim byteArray(LenB(Binary))
            For i = 1 To LenB(Binary)
                byteArray(i-1) = AscB(MidB(Binary, i, 1))
            Next
            VbBinaryToArray = byteArray
        End Function
      </script>
    
      <script language="JavaScript" id="BFR2.js">
    
        (function(){
    
            BinaryFileReader = {};
    
            var FileReadTypes = {
                adTypeBinary : 1,
                adTypeText   : 2
            };
    
            BinaryFileReader.ReadAllBytes = function(path)
            {
                var bs = WScript.CreateObject("ADODB.Stream");
                bs.Type = FileReadTypes.adTypeBinary;
                bs.Open();
                bs.LoadFromFile(path);
                var what = bs.Read;
                bs.Close();
                var array = VbBinaryToArray(what).toArray();
                // I find the length property is 1 higher than it ought to be
                var aL = array.length;
                array.length = aL -1;
                return array;
            };
        })();
    
        var content = BinaryFileReader.ReadAllBytes(path); 
    
      </script>
    </job>
    
        2
  •  4
  •   Cheeso    15 年前

    我找到了 Reading and Writing Binary Files using JScript 关于代码项目。

    不完全是我想要的,但非常接近。

    它使用adodb.stream读取本地文件。显然不可能以常规的方式使用scripting.filesystemobject读取二进制文件,因为不可能使用fso设置代码页。fso总是使用环境代码页,这意味着结果将根据机器的配置而变化。流允许程序指定代码页。下一步是从“文本”映射到一个常规的十六进制字节。这就是上面文章提供的部分。

    我成功使用的结果如下。

    // BinaryFileReader.js
    // ------------------------------------------------------------------
    //
    // give the ability to read a binary file into an array of bytes,
    // to Javascript.
    //
    // the mapping is based on code from:
    //   http://www.codeproject.com/KB/scripting/Exsead7.aspx
    //
    // Created    : Fri May 28 05:20:31 2010
    // Last-saved : <2010-May-28 06:01:34>
    //
    // ------------------------------------------------------------------
    
    (function(){
    
        BinaryFileReader = {};
    
        var FileReadTypes = {
            adTypeBinary : 1,
            adTypeText   : 2
        };
    
        var backward = [];
        backward['C7']   = '80';
        backward['FC']   = '81';
        backward['E9']   = '82';
        backward['E2']   = '83';
        backward['E4']   = '84';
        backward['E0']   = '85';
        backward['E5']   = '86';
        backward['E7']   = '87';
        backward['EA']   = '88';
        backward['EB']   = '89';
        backward['E8']   = '8A';
        backward['EF']   = '8B';
        backward['EE']   = '8C';
        backward['EC']   = '8D';
        backward['C4']   = '8E';
        backward['C5']   = '8F';
        backward['C9']   = '90';
        backward['E6']   = '91';
        backward['C6']   = '92';
        backward['F4']   = '93';
        backward['F6']   = '94';
        backward['F2']   = '95';
        backward['FB']   = '96';
        backward['F9']   = '97';
        backward['FF']   = '98';
        backward['D6']   = '99';
        backward['DC']   = '9A';
        backward['A2']   = '9B';
        backward['A3']   = '9C';
        backward['A5']   = '9D';
        backward['20A7'] = '9E';
        backward['192']  = '9F';
        backward['E1']   = 'A0';
        backward['ED']   = 'A1';
        backward['F3']   = 'A2';
        backward['FA']   = 'A3';
        backward['F1']   = 'A4';
        backward['D1']   = 'A5';
        backward['AA']   = 'A6';
        backward['BA']   = 'A7';
        backward['BF']   = 'A8';
        backward['2310'] = 'A9';
        backward['AC']   = 'AA';
        backward['BD']   = 'AB';
        backward['BC']   = 'AC';
        backward['A1']   = 'AD';
        backward['AB']   = 'AE';
        backward['BB']   = 'AF';
        backward['2591'] = 'B0';
        backward['2592'] = 'B1';
        backward['2593'] = 'B2';
        backward['2502'] = 'B3';
        backward['2524'] = 'B4';
        backward['2561'] = 'B5';
        backward['2562'] = 'B6';
        backward['2556'] = 'B7';
        backward['2555'] = 'B8';
        backward['2563'] = 'B9';
        backward['2551'] = 'BA';
        backward['2557'] = 'BB';
        backward['255D'] = 'BC';
        backward['255C'] = 'BD';
        backward['255B'] = 'BE';
        backward['2510'] = 'BF';
        backward['2514'] = 'C0';
        backward['2534'] = 'C1';
        backward['252C'] = 'C2';
        backward['251C'] = 'C3';
        backward['2500'] = 'C4';
        backward['253C'] = 'C5';
        backward['255E'] = 'C6';
        backward['255F'] = 'C7';
        backward['255A'] = 'C8';
        backward['2554'] = 'C9';
        backward['2569'] = 'CA';
        backward['2566'] = 'CB';
        backward['2560'] = 'CC';
        backward['2550'] = 'CD';
        backward['256C'] = 'CE';
        backward['2567'] = 'CF';
        backward['2568'] = 'D0';
        backward['2564'] = 'D1';
        backward['2565'] = 'D2';
        backward['2559'] = 'D3';
        backward['2558'] = 'D4';
        backward['2552'] = 'D5';
        backward['2553'] = 'D6';
        backward['256B'] = 'D7';
        backward['256A'] = 'D8';
        backward['2518'] = 'D9';
        backward['250C'] = 'DA';
        backward['2588'] = 'DB';
        backward['2584'] = 'DC';
        backward['258C'] = 'DD';
        backward['2590'] = 'DE';
        backward['2580'] = 'DF';
        backward['3B1']  = 'E0';
        backward['DF']   = 'E1';
        backward['393']  = 'E2';
        backward['3C0']  = 'E3';
        backward['3A3']  = 'E4';
        backward['3C3']  = 'E5';
        backward['B5']   = 'E6';
        backward['3C4']  = 'E7';
        backward['3A6']  = 'E8';
        backward['398']  = 'E9';
        backward['3A9']  = 'EA';
        backward['3B4']  = 'EB';
        backward['221E'] = 'EC';
        backward['3C6']  = 'ED';
        backward['3B5']  = 'EE';
        backward['2229'] = 'EF';
        backward['2261'] = 'F0';
        backward['B1']   = 'F1';
        backward['2265'] = 'F2';
        backward['2264'] = 'F3';
        backward['2320'] = 'F4';
        backward['2321'] = 'F5';
        backward['F7']   = 'F6';
        backward['2248'] = 'F7';
        backward['B0']   = 'F8';
        backward['2219'] = 'F9';
        backward['B7']   = 'FA';
        backward['221A'] = 'FB';
        backward['207F'] = 'FC';
        backward['B2']   = 'FD';
        backward['25A0'] = 'FE';
        backward['A0']   = 'FF';
    
        var hD="0123456789ABCDEF";
    
        var d2h = function(d)
        {
            var h = hD.substr(d&15,1);
            while(d>15) {d>>>=4;h=hD.substr(d&15,1)+h;}
            return h;
        }
    
        var h2d = function(h)
        {
            return parseInt(h,16);
        }
    
        var toByteArray = function(inString) {
            var encArray = [];
            var sL = inString.length;
            for (var i=0;i<sL;i++) {
                var cc = inString.charCodeAt(i);
                if(cc>=128) {
                    var h = backward[''+d2h(cc)];
                    cc = h2d(h);
                }
                encArray.push(cc);
            }
            return encArray;
        }
    
    
        var _internalReadAll = function(path) {
            var bs = WScript.CreateObject("ADODB.Stream")
            bs.Type = FileReadTypes.adTypeText;
            bs.CharSet = '437';
            bs.Open();
            bs.LoadFromFile(path);
            var what = bs.ReadText;
            bs.Close();
            return what;
        }
    
        BinaryFileReader.ReadAllBytes = function(name)
        {
            var string = _internalReadAll(name);
            return toByteArray(string);
        }
    
    })();
    

    用途是:

        var bytes = BinaryFileReader.ReadAllBytes(filename);
    
        3
  •  2
  •   nergeia    13 年前

    如果您喜欢纯JScript和COM对象,也许我的方法会很有用。它从二进制数据创建一个JScript字符串。我更喜欢使用COM对象而不是代码页翻译,因为速度快。

    //Reads a binary file, returns a string
    function binaryFileToString(fileName) {
        var binStream = new ActiveXObject("ADODB.Stream");
        var fs = new ActiveXObject("Scripting.FileSystemObject");
        var size = (fs.getFile(fileName)).size;
    
        binStream.Type = 1; //adTypeBinary
        binStream.Open;
    
        binStream.loadFromFile(fileName);
        var binVariant = binStream.read();
        var adLongVarChar = 201;
        var RS = new ActiveXObject("ADODB.Recordset");
    
        RS.fields.append("mBinary", adLongVarChar, size);
        RS.open();
        RS.addNew();
        RS("mBinary").appendChunk(binVariant);
        RS.update();
        return RS("mBinary").value;
    };
    
        4
  •  0
  •   Sijin    15 年前
    Function ReadByteArray(strFileName)
    Const adTypeBinary = 1
    Dim bin
        Set bin = CreateObject("ADODB.Stream")
        bin.Type = adTypeBinary
        bin.Open
        bin.LoadFromFile strFileName
        ReadByteArray = bin.Read
    End Function
    

    http://www.ericphelps.com/q193998/index.htm

        5
  •  0
  •   Ronald Davis    9 年前

    Cheeso_的答案有效,并生成一个数字数组。另一种方法是将第5行替换为

    a.push(ts.Read(1));

    这将生成一个由单个字符组成的数组,而不是一个数字数组。在我的系统(Windows7 64位)中,在一个循环中一次写入一个字节的速度太慢,即使Cheeso__的看似等效的读取功能速度也可以接受。在一个数组中写入一个数组 Write 生成分隔字节的逗号。但是由单个字符数组表示的字节可以由函数写入

    function WriteByte (File, Byte) {
        var Text = "";
        for (I = 0; I < Byte.length; I ++) Text += Byte [I];
        File.Write (Text);
    }
    

    (其中 File 是为ASCII打开的),这在我的应用程序中速度相当快。(我的系统中的javascript中存在一个错误,如果将包含空字符的字符串传递给函数,则在函数中 .length 字符串的属性正确,但第一个空字符之后的每个字符都是 null (与空字符不同)。但是,在这里引用的函数中,空字符 Text 管理得当、快捷。)

    用字符而不是数字来表示字节的另一个优点是,每个字节用两个字节而不是四个字节来表示。当然,缺点是对字节的许多操作都需要 .charCodeAt (0) 方法。

        6
  •  -1
  •   Cheeso    12 年前

    用JScript读取文件的字节。

        function readAllBytes(path) {
            var fso = new ActiveXObject("Scripting.FileSystemObject"),
                ts = fso.OpenTextFile(path, 1), a = [];
            while (!ts.AtEndOfStream)
                a.push(ts.Read(1).charCodeAt(0));
    
            ts.Close();
            return a;
        }