Difference between revisions of "Text To Byte Conversion"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> tag to <source>)
 
(12 intermediate revisions by 3 users not shown)
Line 4: Line 4:
== Text2Bytes.lsl ==
== Text2Bytes.lsl ==


<lsl>
<source lang="lsl2">
string base64characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
list text2bytes(string text)
list text2bytes(string text)
{
{
Line 12: Line 11:
     integer i;
     integer i;
     integer n = llStringLength(base64);
     integer n = llStringLength(base64);
    integer dword;
     for(i = 0; i < n; i += 4)
     for(i = 0; i < n; i += 4)
    {
         bytes += [  ((dword = ((llBase64ToInteger(llGetSubString(base64, i, i + 3) + "==") >> 8) & 0xFFffFF)) >> 16),
         integer dword = llBase64ToInteger(llGetSubString(base64, i, i + 3) + "AA") >> 8;
                    ((dword >> 8) & 0xFF), (dword & 0xFF) ];
        bytes += (dword & 0x00FF0000) >> 16;
     return llList2List(bytes, 0, (-3 >> !!(dword & 0xFF00)) | !!(dword & 0xFF));
        bytes += (dword & 0x0000FF00) >> 8;
        bytes += (dword & 0x000000FF) >> 0;
    }
     return bytes;
}
}
string bytes2text(list bytes)
string bytes2text(list bytes)
{
{
     string text;
     string text = "";
     integer i;
     integer i = -1;
     integer n = llGetListLength(bytes);
     integer b = 0;
     for(i = 0; i + 2 < n; i += 3)
     while((b = (llList2Integer(bytes, ++i) & 0xFF)))
    {
        integer b1 = llList2Integer(bytes, i);
        integer b2 = llList2Integer(bytes, i + 1);
        integer b3 = llList2Integer(bytes, i + 2);
        integer bbb = (b1 & 0xff) << 16 | (b2 & 0xFF) << 8 | (b3 & 0xFF);
        text += llGetSubString(base64characters, (bbb & 0x00FC0000) >> 18, (bbb & 0x00FC0000) >> 18);
        text += llGetSubString(base64characters, (bbb & 0x0003F000) >> 12, (bbb & 0x0003F000) >> 12);
        text += llGetSubString(base64characters, (bbb & 0x00000FC0) >> 6, (bbb & 0x00000FC0) >> 6);
        text += llGetSubString(base64characters, (bbb & 0x0000003F) >> 0, (bbb & 0x0000003F) >> 0);
    }
    if(n - i > 0 && n - 1 > 3)
     {
     {
         integer two = n - i - 1;
         integer A = (b << 22) & 0x3C000000;
       
         integer B = (b << 20) & 0x00F00000;
        integer b1 = llList2Integer(bytes, i);
         text += "%" + llGetSubString(llIntegerToBase64(
        integer b2 = llList2Integer(bytes, i + 1);
                        A + B + 0xD3400000
         integer bbb = (b1 & 0xff) << 16;
                        - (0xF8000000 * (A / 0x28000000))//lowercase=0x90000000, uppercase=0xF8000000
        if(two) bbb = bbb | (b2 & 0xFF) << 8;
                        - (0x03E00000 * (B / 0x00A00000))//lowercase=0x02400000, uppercase=0x03E00000
         text += llGetSubString(base64characters, (bbb & 0x00FC0000) >> 18, (bbb & 0x00FC0000) >> 18);
                      ), 0, 1);
        text += llGetSubString(base64characters, (bbb & 0x0003F000) >> 12, (bbb & 0x0003F000) >> 12);
        if(two)
            text += llGetSubString(base64characters, (bbb & 0x00000FC0) >> 6, (bbb & 0x00000FC0) >> 6);
        else
            text += "=";
        text += "=";
     }
     }
     return llBase64ToString(text);
     return llUnescapeURL(text);
}
}


Line 77: Line 57:
}
}


</lsl>
</source>


{{LSLC|Examples|Text To Byte Conversion}}
{{LSLC|Examples|Text To Byte Conversion}}
{{LSLC|User-Defined_Functions}}
[[Category: LSL Encryption]]
[[Category: LSL Encryption]]

Latest revision as of 15:40, 22 January 2015

Here's a function to pass a string of text and receive a list of bytes. A second function is provided to work in reverse. These methods are especially useful for working with encryption.

Text2Bytes.lsl

list text2bytes(string text)
{
    string base64 = llStringToBase64(text);
    list bytes;
    integer i;
    integer n = llStringLength(base64);
    integer dword;
    for(i = 0; i < n; i += 4)
        bytes += [  ((dword = ((llBase64ToInteger(llGetSubString(base64, i, i + 3) + "==") >>  8) & 0xFFffFF)) >> 16), 
                    ((dword >> 8) & 0xFF), (dword & 0xFF) ];
    return llList2List(bytes, 0, (-3 >> !!(dword & 0xFF00)) | !!(dword & 0xFF));
}

string bytes2text(list bytes)
{
    string text = "";
    integer i = -1;
    integer b = 0;
    while((b = (llList2Integer(bytes, ++i) & 0xFF)))
    {
        integer A = (b << 22) & 0x3C000000;
        integer B = (b << 20) & 0x00F00000;
        text += "%" + llGetSubString(llIntegerToBase64(
                        A + B + 0xD3400000
                        - (0xF8000000 * (A / 0x28000000))//lowercase=0x90000000, uppercase=0xF8000000
                        - (0x03E00000 * (B / 0x00A00000))//lowercase=0x02400000, uppercase=0x03E00000
                      ), 0, 1);
    }
    return llUnescapeURL(text);
}

default
{
    state_entry()
    {
        list bytes = text2bytes("Hello, Avatar!");
        llSay(0, llList2CSV(bytes));

        string text = bytes2text(bytes);
        llSay(0, text);
    }

    touch_start(integer total_number)
    {
        list bytes = text2bytes("Touched.");
        llSay(0, llList2CSV(bytes));

        string text = bytes2text(bytes);
        llSay(0, text);
    }
}