Hex

From Second Life Wiki
Revision as of 10:48, 10 October 2007 by Ppaatt Lynagh (talk | contribs) (Caution: This page is a work in progress. The specification, the implementation, the demo, and the sample results may not yet be totally consistent. See the discussion tab.)
Jump to navigation Jump to search

Function: string hex(integer value);

Caution: This page is a work in progress. The specification, the implementation, the demo, and the sample results may not yet be totally consistent. See the discussion tab.

Returns the hexadecimal nybbles of the signed integer value, in order, prefixed by "0x" or by "-0x", without any leading zeroes.

Parameters:

• integer value value to be converted

This function works like the hex function of the Python scripting language, doc'ed within http://docs.python.org/lib/built-in-funcs.html. Specifically, this function returns a signed 31-bit result if negative, rather than a 32-bit result. Returns upper case nybbles by default but that can easily be changed by editing the value of HEXC.

Implementation

// http://wiki.secondlife.com/wiki/Hex

string HEXC = "0123456789ABCDEF";

string hexu(integer value)
{
    integer ny = (value & 0xF);
    string nybbles = llGetSubString(HEXC, ny, ny);
    if ((value = (0xfffFFFF & (value >> 4))))
    {
        do
        {
            nybbles = llGetSubString(HEXC, ny = (value & 0xF), ny) + nybbles;
        } while ((value = (value >> 4)));
    }
    return "0x" + nybbles;
}

string hex(integer value)
{
    if (value < 0) return "-" + hexu(-value);
    return hexu(value);
}

Demo

Print the most astonishing test cases and then also the permission masks of a script.

Code:

default
{
    state_entry()
    {
        llOwnerSay("Hello");
        llOwnerSay(hex(0) + " == 0");
        llOwnerSay(hex(0x00FEDC00 & -0x00FEDC00) + " == (0x00FEDC00 & -0x00FEDC00)");
        llOwnerSay(hex(1 << 30) + " == (1 << 30)");
        llOwnerSay(hex(1 << 31) + " == (1 << 31)");
        llOwnerSay(hex(0xFEDC9876) + " == 0xFEDC9876");
        llOwnerSay(hex(-1) + " == -1");
        llOwnerSay(hex(0x123456789) + " == 0x123456789");
        llOwnerSay("OK");
        
        llOwnerSay("Hello again");
        string item = llGetScriptName();
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_BASE)) + " as base");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_OWNER)) + " by owner");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_GROUP)) + " by group");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_EVERYONE)) + " by anyone");
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_NEXT)) + " by next owner");
        llOwnerSay((string) llGetInventoryPermMask(item, MASK_NEXT) + " by next owner");
        llOwnerSay("OK");
    }
}

Sample results:

Hello
0x0 == 0
0x400 == (0x00FEDC00 & -0x00FEDC00)
0x40000000 == (1 << 30)
-0x80000000 == (1 << 31)
-0x123678a == 0xFEDC9876
-0x1 == -1
-0x1 == 0x123456789
OK
Hello again
0x7fffffff as base
0x7fffffff by owner
0x0 by group
0x0 by anyone
0x82000 by next owner
532480 by next owner
OK