User talk:Becky Pippen/Text Storage
Jump to navigation
Jump to search
Memory optimized versions
Someone recently asked for a more memory efficient version so I hacked one together. It could be made faster by using two loops, and pealing off characters in bigger groups more infrequently.
<lsl>string encode15BitsToChar(integer num) {
// Check the incoming range
if (num < 0 || num >= 0x8000) {
// illegal input -- do whatever is appropriate
return "�";
}
// Bias the incoming numeric value by 0x1000 to avoid illegal Unicode codes:
num += 0x1000;
// construct UTF-8 layout:
num = 0xE0808000 | (num << 12) | ((num << 10) & 0x3f0000) | ((num << 8) & 0x3f00);
// Convert the UTF-8 into a 16-bit Unicode character:
return llGetSubString(llBase64ToString(llIntegerToBase64(num)), 0, 0);
}
integer decodeCharTo15Bits(string ch) {
integer val = llBase64ToInteger(llStringToBase64(ch));
if((val & 0xE0000000) ^ 0xE0000000)
return -1; //The character is not 3 bytes.
return ((val & 0x0f000000) >> 12) +
((val & 0x003f0000) >> 10) +
((val & 0x00003f00) >> 8) - 0x1000;
}
string compressAscii(string s) {
integer len = llStringLength(s);
// Append a space if needed to make s an even number of chars
if (len & 1) {
s += " ";
}
string encodedChars = "";
while( (len -= 2) > -2 ) {
string chars = llGetSubString(s, 0, 1);
s = llGetSubString(s, 2, 0x7ffffff0);
encodedChars += encode15BitsToChar(
charToUnicodeIdNumber(chars) << 7 |
charToUnicodeIdNumber(llGetSubString(chars, 1, 1)));
}
return encodedChars;
}
string uncompressAscii(string s) {
string result = "";
integer len = llStringLength(s);
while ( 0 <= --len ) {
integer cInt15 = decodeCharTo15Bits(llGetSubString(s, 0, 0));
s = llGetSubString(s, 1, 0x7ffffff0);
result += llGetSubString(llBase64ToString(llIntegerToBase64(
((cInt15 << 17) & 0x7f000000) |
((cInt15 << 16) & 0x007f0000)
)), 0, 1);
}
return result;
}</lsl>