Difference between revisions of "Text To Byte Conversion"

From Second Life Wiki
Jump to navigation Jump to search
Line 36: Line 36:
     integer i;
     integer i;
     integer n = llGetListLength(bytes);
     integer n = llGetListLength(bytes);
     for(i = 0; i + 3 < n; i += 3)
     for(i = 0; i + 2 < n; i += 3)
     {
     {
         integer b1 = llList2Integer(bytes, i);
         integer b1 = llList2Integer(bytes, i);

Revision as of 01:45, 5 January 2008

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

<lsl> string base64characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; list text2bytes(string text) {

   string base64 = llStringToBase64(text);
   list bytes;
   integer i;
   integer n = llStringLength(base64);
   for(i = 0; i < n; i += 4)
   {
       string c1 = llGetSubString(base64, i + 0, i + 0);
       string c2 = llGetSubString(base64, i + 1, i + 1);
       string c3 = llGetSubString(base64, i + 2, i + 2);
       string c4 = llGetSubString(base64, i + 3, i + 3);
       integer b1 = llSubStringIndex(base64characters, c1);
       integer b2 = llSubStringIndex(base64characters, c2);
       integer b3 = llSubStringIndex(base64characters, c3);
       integer b4 = llSubStringIndex(base64characters, c4);
       integer bbb = (b1 << 18) + (b2 << 12);
       if(b3 != -1) bbb += (b3 << 6);
       if(b4 != -1) bbb += (b4 << 0);
       bytes += (bbb & 0xFF0000) >> 16;
       if(b3 != -1) bytes += (bbb & 0xFF00) >> 8;
       if(b4 != -1) bytes += bbb & 0xFF;
   }
   return bytes;

} string bytes2text(list bytes) {

   string text;
   integer i;
   integer n = llGetListLength(bytes);
   for(i = 0; i + 2 < n; i += 3)
   {
       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 b1 = llList2Integer(bytes, i);
       integer b2 = llList2Integer(bytes, i + 1);
       integer bbb = (b1 & 0xff) << 16;
       if(two) bbb = bbb | (b2 & 0xFF) << 8;
       text += llGetSubString(base64characters, (bbb & 0x00FC0000) >> 18, (bbb & 0x00FC0000) >> 18);
       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);

}

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

}

</lsl>