您的位置:首页 > Web前端 > JavaScript

js:读写二进制变通方法,需要有权限控制adodb.stream,可以配合hta使用

2013-04-09 21:12 549 查看
IntroductionAs I have pushed what I can do in JScript, I have come up against the issue of binaryfiles. The following class solved this for small to medium size files. I am partly including this post here because I am about to put in a post about sending emails with attachments via JScript, and it will use this binary file code to read in the binary attachment files.
So, here is a nice way of accessing binaryfiles from JScript. If you want to access this object from VBScript, then put it in a SWF file. This object has been used in anger to upload files to a Web Service, and has proven to be nice and fast for files in the 0-10 MB range.


Collapse | Copy Code/** This is a fairly well optimized object which alows * access to binaryfiles from JScript on a Windows * operating system. * * A the end of the file is small set of tests to show how it * is used. You will require ADODB 2.5 or higher installed. * this will be so on most 2000 machines and all XP or higher * machines. * * CopyRight: Dr Alexander J Turner - all rights reserved. * Please feel free to use this code in any way you like * as long as you place a reference in the comments that * I wrote it. */functionBinaryFile(name){ var adTypeBinary = 1var adTypeText = 2var adSaveCreateOverWrite = 2// The trick - this is the 'old fassioned' not translation page// It lest javascript use strings to act like raw octetsvar codePage='437'; this.path=name; var forward = new Array(); var backward = new Array(); // Note - for better performance I should preconvert these hex// definitions to decimal - at some point :-) - AJT forward['80'] = '00C7'; forward['81'] = '00FC'; forward['82'] = '00E9'; forward['83'] = '00E2'; forward['84'] = '00E4'; forward['85'] = '00E0'; forward['86'] = '00E5'; forward['87'] = '00E7'; forward['88'] = '00EA'; forward['89'] = '00EB'; forward['8A'] = '00E8'; forward['8B'] = '00EF'; forward['8C'] = '00EE'; forward['8D'] = '00EC'; forward['8E'] = '00C4'; forward['8F'] = '00C5'; forward['90'] = '00C9'; forward['91'] = '00E6'; forward['92'] = '00C6'; forward['93'] = '00F4'; forward['94'] = '00F6'; forward['95'] = '00F2'; forward['96'] = '00FB'; forward['97'] = '00F9'; forward['98'] = '00FF'; forward['99'] = '00D6'; forward['9A'] = '00DC'; forward['9B'] = '00A2'; forward['9C'] = '00A3'; forward['9D'] = '00A5'; forward['9E'] = '20A7'; forward['9F'] = '0192'; forward['A0'] = '00E1'; forward['A1'] = '00ED'; forward['A2'] = '00F3'; forward['A3'] = '00FA'; forward['A4'] = '00F1'; forward['A5'] = '00D1'; forward['A6'] = '00AA'; forward['A7'] = '00BA'; forward['A8'] = '00BF'; forward['A9'] = '2310'; forward['AA'] = '00AC'; forward['AB'] = '00BD'; forward['AC'] = '00BC'; forward['AD'] = '00A1'; forward['AE'] = '00AB'; forward['AF'] = '00BB'; forward['B0'] = '2591'; forward['B1'] = '2592'; forward['B2'] = '2593'; forward['B3'] = '2502'; forward['B4'] = '2524'; forward['B5'] = '2561'; forward['B6'] = '2562'; forward['B7'] = '2556'; forward['B8'] = '2555'; forward['B9'] = '2563'; forward['BA'] = '2551'; forward['BB'] = '2557'; forward['BC'] = '255D'; forward['BD'] = '255C'; forward['BE'] = '255B'; forward['BF'] = '2510'; forward['C0'] = '2514'; forward['C1'] = '2534'; forward['C2'] = '252C'; forward['C3'] = '251C'; forward['C4'] = '2500'; forward['C5'] = '253C'; forward['C6'] = '255E'; forward['C7'] = '255F'; forward['C8'] = '255A'; forward['C9'] = '2554'; forward['CA'] = '2569'; forward['CB'] = '2566'; forward['CC'] = '2560'; forward['CD'] = '2550'; forward['CE'] = '256C'; forward['CF'] = '2567'; forward['D0'] = '2568'; forward['D1'] = '2564'; forward['D2'] = '2565'; forward['D3'] = '2559'; forward['D4'] = '2558'; forward['D5'] = '2552'; forward['D6'] = '2553'; forward['D7'] = '256B'; forward['D8'] = '256A'; forward['D9'] = '2518'; forward['DA'] = '250C'; forward['DB'] = '2588'; forward['DC'] = '2584'; forward['DD'] = '258C'; forward['DE'] = '2590'; forward['DF'] = '2580'; forward['E0'] = '03B1'; forward['E1'] = '00DF'; forward['E2'] = '0393'; forward['E3'] = '03C0'; forward['E4'] = '03A3'; forward['E5'] = '03C3'; forward['E6'] = '00B5'; forward['E7'] = '03C4'; forward['E8'] = '03A6'; forward['E9'] = '0398'; forward['EA'] = '03A9'; forward['EB'] = '03B4'; forward['EC'] = '221E'; forward['ED'] = '03C6'; forward['EE'] = '03B5'; forward['EF'] = '2229'; forward['F0'] = '2261'; forward['F1'] = '00B1'; forward['F2'] = '2265'; forward['F3'] = '2264'; forward['F4'] = '2320'; forward['F5'] = '2321'; forward['F6'] = '00F7'; forward['F7'] = '2248'; forward['F8'] = '00B0'; forward['F9'] = '2219'; forward['FA'] = '00B7'; forward['FB'] = '221A'; forward['FC'] = '207F'; forward['FD'] = '00B2'; forward['FE'] = '25A0'; forward['FF'] = '00A0'; 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"; this.d2h = function(d) { var h = hD.substr(d&15,1); while(d>15) {d>>=4;h=hD.substr(d&15,1)+h;} return h; } this.h2d = function(h) { return parseInt(h,16); } this.WriteAll = function(what) { //Create Stream objectvarBinaryStream = WScript.CreateObject("ADODB.Stream"); //Specify stream type - we cheat and get string but 'like' binaryBinaryStream.Type = adTypeText; BinaryStream.CharSet = '437'; //Open the streamBinaryStream.Open(); // Write to the streamBinaryStream.WriteText(this.Forward437(what)); // Write the string to the diskBinaryStream.SaveToFile(this.path, adSaveCreateOverWrite); // Clearn upBinaryStream.Close(); } this.ReadAll = function() { //Create Stream object - needs ADO 2.5 or heighervarBinaryStream = WScript.CreateObject("ADODB.Stream") //Specify stream type - we cheat and get string but 'like' binaryBinaryStream.Type = adTypeText; BinaryStream.CharSet = codePage; //Open the streamBinaryStream.Open(); //Load the file data from disk To stream objectBinaryStream.LoadFromFile(this.path); //Open the stream And get binary 'string' from the objectvar what = BinaryStream.ReadText; // Clean upBinaryStream.Close(); returnthis.Backward437(what); } /* Convert a octet number to a code page 437 char code */this.Forward437 = function(inString) { var encArray = new Array(); var tmp=''; var i=0; var c=0; var l=inString.length; var cc; var h; for(;i<l;++i) { c++; if(c==128) { encArray.push(tmp); tmp=''; c=0; } cc=inString.charCodeAt(i); if(cc<128) { tmp+=String.fromCharCode(cc); } else { h=this.d2h(cc); h=forward[''+h]; tmp+=String.fromCharCode(this.h2d(h)); } } if(tmp!='') { encArray.push(tmp); } // this loop progressive concatonates the// array elements entil there is only onevar ar2=new Array(); for(;encArray.length>1;) { var l=encArray.length; for(var c=0;c<l;c+=2) { if(c+1==l) { ar2.push(encArray[c]); } else { ar2.push(''+encArray[c]+encArray[c+1]); } } encArray=ar2; ar2=new Array(); } return encArray[0]; } /* Convert a code page 437 char code to a octet number*/this.Backward437 = function(inString) { var encArray = new Array(); var tmp=''; var i=0; var c=0; var l=inString.length; var cc; var h; for(;i<l;++i) { c++; if(c==128) { encArray.push(tmp); tmp=''; c=0; } cc=inString.charCodeAt(i); if(cc<128) { tmp+=String.fromCharCode(cc); } else { h=this.d2h(cc); h=backward[''+h]; tmp+=String.fromCharCode(this.h2d(h)); } } if(tmp!='') { encArray.push(tmp); } // this loop progressive concatonates the// array elements entil there is only onevar ar2=new Array(); for(;encArray.length>1;) { var l=encArray.length; for(var c=0;c<l;c+=2) { if(c+1==l) { ar2.push(encArray[c]); } else { ar2.push(''+encArray[c]+encArray[c+1]); } } encArray=ar2; ar2=new Array(); } return encArray[0]; } }// Example Code/*var bf0=new BinaryFile();var crFolder = 'C:/Temp/cr'var bf1=new BinaryFile(crFolder+"/PCDV0026.JPG");var bf2=new BinaryFile(crFolder+"/PCDV0026_.JPG");bf2.WriteAll(bf1.ReadAll());*/LicenseThis article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



像上图,文本编辑器实际只输入一个感叹号!(unicode唯一对应号是u+2100),选择unicode保存(bom是有标志意思, 在win的记事本中是没有bom一名),
在ue中使用二进制查看,发现实际的硬盘空间中前面二byte放了unicode的标志(ff fe)
然后ado也会像记事本一样遵守"标志"规则,前面二byte是标志,并不是内容,判断符合,读取后面的二个byte(既是21 00)输出,即position=0;ado.readText(1) == !,
所以你设置成charset是unicode话,它会按"规则"读取,你永远得不到前面二个.byte.

而ibm的codepage 437编码却是这样解析:它刚好是一个字占8bit,且没有编码标志位的规定(这很重要,关键到你是否能得到全部的内容),所以read(1)和position = 0;是从硬盘储存结构意义上的第一位开始读取的,这跟二进制读取是一样的.完全跟unicode处理方式不同,且很好一点就是它一个字刚好就是一byte,上面的把字进行转码再做比较(上面程序中hash对象表)是因为,437不是国际通用代码,它会在不同地方每个字对应关系不一样,有可能在美国,00对应美国字a,而在中国, 00对应的字是 我,那么你用var c = ado.read(1) 与 我 比较,在中国电脑是对应的,而在美国却跟a不是相同的,因为字符比较在js中是需要转成unicode对应编码来比较的,a与我在unicode并不相同,所以结果就不同了.unicode的编码却是在全球是固定意义的.且ado.read返回的就是unicode码,显示时再转成对应的本地系统的对应字来的,而它在硬盘中的二进制保存值跟unicode有绝对的对应关系,通过这关系,就能得到直正的二进制值了.这是这代码的关键
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐