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();
}