Hasznos függvények
Azt hiszem mindenkivel előfordul, hogy egy-egy feladat kapcsán komoly problémába
ütközik, miszerint egy adott programnyelvben egy pici részfeladatot
meg kellene oldani, de nincs rá kész megoldás, így órákon, esetleg napokon keresztül
keresgélünk az interneten, kérdezgetünk a levelező listákon. Ez hatványozottan igaz
a script nyelvekre, a limitált funkciókészlet miatt.
Ezen esetek kapcsán az ember kialakít függvény-könyvtárakat, amik ezeket a feladatokat
oldják meg. Itt csokorba szedve próbálom közkincsé tenni azokat a kódrészleteket, amelyek
az én munkámat segítették idáig. Ezen darabok nagy része nem a saját agyszüleményem,
hanem az interneten, levelezőlistákon itt-ott megtalált darabok. Első körben néhány JScript darab következik.
GUID (Globally Unique IDentifier) Generálása:
function CreateGUID()
{
var TypeLib = new ActiveXObject("Scriptlet.TypeLib");
return TypeLib.Guid.substring(0,38);
}
Ha az ember levelet szeretne küldeni a Microsoft CDO (Collaboration Data Objects)
segítségével, azt könnyen megteheti, rengeteg példaprogram van rá mindenfelé a nagyvilágban.
Ugyanakkor, ha az ember itt él Kelet-európában, akkor azzal van megverve, hogy olyan
különleges karaktereket kell használnia, ami a Nyugat-európai karakterkészletben nem
található meg. Ki ne ismerné Magyarországon az ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP fogalmát!?
Rengeteget hallunk arról, hogy így, meg úgy tökéletes a termékek lokalizálása. Ezek
után a fejlesztő meglepetten tapasztalhatja, hogy a rendszere lokalizációs beállításaitól
függetlenül a létrehozott CDO levél objektum "iso-8859-1"-es, azaz Nyugat-európai lokalizációval
jön létre. Ezt hivatott megoldani a következő kódrészlet:
function CreateLocalizedCDOMessage(Locale)
{
var _Msg = new ActiveXObject("CDO.Message");
_Msg.Fields("urn:schemas:mailheader:content-type") = "text/plain; charset=\"" + Locale + "\"";
_Msg.Fields("urn:schemas:httpmail:content-type") = "text/plain; charset=\"" + Locale + "\"";
_Msg.Fields.Update();
return _Msg;
}
Ezt a kódrészeltet a következő módon használva már kész is van az "ÁRVÍZTŰRŐ" levelünk:
var Msg = CreateLocalizedCDOMessage("iso-8859-2");
Ha valaki elkezd dolgozni az Active Directory-val JScript-ből például az ADSI OLE DB-t használva,
és valamiért az Active Directory-ban található bináris adatokkal (SID, GUID, tanusítvány, stb.)
kellene foglalkoznia meglepetten fogja tapasztalni, hogy ugyan le tudja ezeket az adatokat kérni,
de egyszerűen semmit sem tud kezdeni velük. Ezek az adatok ugyanis nem viselkednek a JScript-ben
használható objektumokként. Némi trükkel (az ADODB.Stream használatával) mégis hozzá tudunk férni
ezekhez.
Most bemutatok néhány függvényt ami lehetőséget biztosít ezek használatához:
ByteArrayToFile(p_byteArray,p_fileSpec) |
Fájlba menti a bináris adatot |
ByteArrayToHexStr(p_byteArray) |
Egyszerű hexadecimális string-é konvertálja a bináris adatot |
ByteArrayToGUIDStr(p_byteArray) |
GUID formátumú string-é konvertálja a bináris adatot |
ByteArrayToSIDStr(p_byteArray) |
SID formátumú string-é konvertálja a bináris adatot |
Külön köszönet Vargha Dánielnek a byte array -> unicode string konverziós ötletért.
function ByteArrayToFile(p_byteArray,p_fileSpec)
{
var adTypeBinary = 1;
var strm = new ActiveXObject("ADODB.Stream");
strm.Open();
strm.Type = adTypeBinary;
strm.Write(p_byteArray);
strm.SaveToFile(p_fileSpec);
strm.Close();
}
function ByteArrayToHexStr(p_byteArray)
{
var numArray = ByteArrayToNumArray(p_byteArray);
var retValue = "";
for(i=0;i<numArray.length;i++)
retValue += ByteToHex(numArray[i]);
return retValue;
}
function ByteArrayToGUIDStr(p_byteArray)
{
var numArray = ByteArrayToNumArray(p_byteArray);
if(numArray.length == 16)
{
return ByteToHex(numArray[3]) +
ByteToHex(numArray[2]) +
ByteToHex(numArray[1]) +
ByteToHex(numArray[0]) +
"-" +
ByteToHex(numArray[5]) +
ByteToHex(numArray[4]) +
"-" +
ByteToHex(numArray[7]) +
ByteToHex(numArray[6]) +
"-" +
ByteToHex(numArray[8]) +
ByteToHex(numArray[9]) +
"-" +
ByteToHex(numArray[10]) +
ByteToHex(numArray[11]) +
ByteToHex(numArray[12]) +
ByteToHex(numArray[13]) +
ByteToHex(numArray[14]) +
ByteToHex(numArray[15]);
}
else return "";
}
function ByteArrayToSIDStr(p_byteArray)
{
var retValue = "s-";
var numArray = ByteArrayToNumArray(p_byteArray);
if(numArray.length == (8 + (numArray[1] * 4)))
{
retValue += numArray[0].toString() + "-" + ReverseByteArrayToStr(numArray.slice(2,8));
for(var i=0;i<numArray[1];i++)
retValue += "-" + ByteArrayToStr(numArray.slice(8+(i*4),12+(i*4)));
return retValue;
}
else return "";
}
function ByteArrayToNumArray(p_byteArray)
{
var adTypeBinary = 1;
var adTypeText = 2;
var retArr = new Array();
var binWord;
var strm = new ActiveXObject("ADODB.Stream");
strm.Open();
strm.Type = adTypeBinary;
strm.Write(p_byteArray);
strm.Position = 0;
strm.Type = adTypeText;
strm.Charset = "unicode";
var binStr = strm.ReadText();
for (i = 0; i < binStr.length; i++)
{
binWord = binStr.charCodeAt(i);
retArr.push(binWord & 0xFF);
retArr.push(binWord >> 8);
}
return retArr;
}
function ByteToHex(p_byte)
{
var result = p_byte.toString(16);
if (result.length < 2)
result = "0" + result;
return result.toUpperCase();
}
function ByteArrayToStr(p_byteArray)
{
var retValue = 0;
for(var i=p_byteArray.length-1;i>=0;i--)
retValue = (retValue * 256) + p_byteArray[j];
return retValue.toString();
}
function ReverseByteArrayToStr(p_byteArray)
{
var retValue = 0;
for(var i=0;i<p_byteArray.length;i++)
retValue = (retValue * 256) + p_byteArray[i];
return retValue.toString();
}