Difference between revisions of "Hex"

From Second Life Wiki
Jump to navigation Jump to search
(distinguish hex from hexu to conform to the cited Python spec -- add distinguishing test cases -- omit the confusing-to-newbie LSL-specific test-an-assignment-in-arg-list optimisation)
(→‎Demo: add the astonishing 0x123456789 example (saturates at min neg equal to max unsigned, rather than rolling over in two's complement like C often does))
Line 69: Line 69:
         llOwnerSay(hex(0xFEDC9876));
         llOwnerSay(hex(0xFEDC9876));
         llOwnerSay(hex(-1));
         llOwnerSay(hex(-1));
        llOwnerSay(hex(0x123456789));
         llOwnerSay("OK");
         llOwnerSay("OK");
          
          
Line 92: Line 93:
-0x80000000
-0x80000000
-0x123678a
-0x123678a
-0x1
-0x1
-0x1
OK
OK

Revision as of 17:23, 9 October 2007

Function: string hex(integer value);

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. and this function returns the easier-to-type lower case nybbles a la AT&T, rather than the easier-to-read upper case nybbles a la IBM.

Implementation

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

string HEXC = "0123456789ABCDEF";

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

string hex(integer value)
{
    if (value == (1 << 31)) return "-0x80000000";
    if (value < 0) return "-" + hex(-value);
    return llToLower(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));
        llOwnerSay(hex(0x00FEDC00 & -0x00FEDC00));
        llOwnerSay(hex(1 << 30));
        llOwnerSay(hex(1 << 31));
        llOwnerSay(hex(0xFEDC9876));
        llOwnerSay(hex(-1));
        llOwnerSay(hex(0x123456789));
        llOwnerSay("OK");
        
        llOwnerSay("Hello again");
        string item = llGetScriptName();
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_BASE)));
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_OWNER)));
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_GROUP)));
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_EVERYONE)));
        llOwnerSay(hex(llGetInventoryPermMask(item, MASK_NEXT)));
        llOwnerSay((string) llGetInventoryPermMask(item, MASK_NEXT));
        llOwnerSay("OK");
    }
}

Sample results:

Hello
0x0
0x400
0x40000000
-0x80000000
-0x123678a
-0x1
-0x1
OK
Hello again
0x7fffffff
0x7fffffff
0x0
0x0
0x82000
532480
OK